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
。