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

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

我在列表/文本文件(文件测试.txt)。

例如:

smith
johnson
west

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

期望的输出:

asmith
bsmith
csmith
dsmith
...
ajohnson
bjohnson
cjohnson
etc., etc.

答案1

使用awk

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

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

答案2

像下面这样的东西可以做到这一点:

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

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

答案3

join通过尝试连接不存在的列来使用该实用程序进行交叉连接:

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

或者,在没有过程替换的情况下:

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

最后sed的 删除了 中两个输出列之间的空格join

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

输出将是

asmith
bsmith
csmith
dsmith
esmith
fsmith

etc.

答案4

可以申请Brace Expansion

eval printf "'%s\n'" "{a..z}{$(paste -sd, file)}"

执行eval命令后,我们得到以下结果:

printf '%s\n' {a..z}{smith,johnson,west}

更新:

eval printf "'%s\n'" "{$(paste -sd, file)}\ {a..z}" | column -to '' -O2

-O2- 首都o。列的输出顺序。从第二列开始。

相关内容