如何为每一行添加不同的前缀?

wea*_*lol 2 linux sed

我在列表/文本文件(文件test.txt)中有一个名称列表。

例如:

smith
johnson
west
Run Code Online (Sandbox Code Playgroud)

我如何将每个字母添加为每行的前缀,并将其作为新的文本文件输出?

期望的输出:

asmith
bsmith
csmith
dsmith
...
ajohnson
bjohnson
cjohnson
etc., etc.
Run Code Online (Sandbox Code Playgroud)

Rom*_*nov 6

像下面这样的东西可以解决问题:

while IFS= read -r i; do
  for j in {a..z}; do
    echo "${j}${i}"
  done
done < input_file > new_text_file
# use `>> new_text_file` to append instead of overwrite
Run Code Online (Sandbox Code Playgroud)

该while循环从文件读取的名字,该for循环从生成字母A到Z。该echo命令连接从 a 到 z 的字母和从文件中读取的名称。


αғs*_*нιη 6

使用awk:

awk '{ for (asc=97; asc<=122; asc++)printf ("%c%s\n", asc, $0) }' infile
Run Code Online (Sandbox Code Playgroud)

我们使用 printf 及其%c(字符转换修饰符,有关详细信息,请参阅man awk)打印从 ascii-code: 97 (character a) 到 ascii-code:122 (character z)开始的 ASCII 小写英文字母转换后的字符当前行本身。见 ASCII 表。


Kus*_*nda 6

join通过尝试加入不存在的列来与实用程序进行交叉联接:

join -1 2 -2 2 -o 2.1,1.1 file <( printf '%s\n' {a..z} ) | sed 's/\(.\) /\1/'
Run Code Online (Sandbox Code Playgroud)

或者,没有进程替换:

printf '%s\n' {a..z} | join -1 2 -2 2 -o 2.1,1.1 file - | sed 's/\(.\) /\1/'
Run Code Online (Sandbox Code Playgroud)

所述sed在端部除去来自两个输出的列之间的空间join。

与join命令一起使用的选项指定要加入每个文件的第二列(-1 2和-2 2)。由于此列不存在,您将获得“全部对全部”的效果。该-o选项及其选项参数用于指定输出格式。我们在第一个文件的数据之前获取第二个文件的数据-o 2.1,1.1(“第二个文件的第一列,然后是第一个文件的第一列”)。

输出将是

asmith
bsmith
csmith
dsmith
esmith
fsmith

etc.
Run Code Online (Sandbox Code Playgroud)