我在列表/文本文件(文件测试.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
。列的输出顺序。从第二列开始。