给一行中的每一列添加一个字符串——不包括第一列,可变行长,字符串包含在每行的第一列

Top*_*key 5 sed awk text-processing

我有一个多行/多行的文件,每行包含可变数量的列:

Name1 String111 String112
Name2 String121 String122 String123
Name3 String131 String132 String133 String134
Run Code Online (Sandbox Code Playgroud)

依此类推(没有关于哪一行有多少条目的模式)。我想将第一列中的名称添加到该行/行中每一列的开头,这样我最终会得到:

Name1 Name1String111 Name1String112
Name2 Name2String121 Name2String122 Name2String123
Name3 Name3String131 Name3String132 Name3String133 Name3String134
Run Code Online (Sandbox Code Playgroud)

我们可以从简单开始,然后变得更复杂:

如何在每列的开头添加诸如“Test”之类的字符串?

如何将第 1 列中的值添加到该行中的每一列,包括第 1 列?

如何将第 1 列中的值添加到该行中的每一列,不包括第 1 列?

我最好的猜测:

我不知道如何调用“每一列”,也不知道如何使命令访问当前列,因此我只能将第 1 列中的字符串或值添加到其他单个列中:

awk -F'\t' -vOFS='\t' '{ !$1 = "hello" $2}' 
awk -F'\t' -vOFS='\t' '{ !$1 = $1 $2}' 
Run Code Online (Sandbox Code Playgroud)

有没有关于我可以在哪里学习这种语法的好资源?

ter*_*don 10

只需从第二个字段开始迭代所有字段,并将第一个字段连接到您已有的任何字段:

$ awk '{ for(i=2;i<=NF;i++){ $i = $1$i }}1' file
Name1 Name1String111 Name1String112
Name2 Name2String121 Name2String122 Name2String123
Name3 Name3String131 Name3String132 Name3String133 Name3String134
Run Code Online (Sandbox Code Playgroud)

1到底是“打印当前行” awk的简写。你可以像这样写同样的东西:

$ awk '{ for(i=2;i<=NF;i++){ $i = $1$i }; print}' file
Name1 Name1String111 Name1String112
Name2 Name2String121 Name2String122 Name2String123
Name3 Name3String131 Name3String132 Name3String133 Name3String134
Run Code Online (Sandbox Code Playgroud)

上面的基本思想可以简单地扩展以匹配您的所有示例。NF是保存字段数的特殊 awk 变量;无论当前行中存在多少字段,它将始终设置为。然后,awk允许您使用变量引用特定字段。所以如果你设置了i=5,那么$i就等价于$5. 然后,您可以使用将所有数字for(i=2;i<=NF;i++) { }设置为此行上的字段i数的格式迭代所有字段2