我在列表/文本文件(文件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)
像下面这样的东西可以解决问题:
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 的字母和从文件中读取的名称。
使用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 表。
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)