我有多个处理步骤产生的文本文件,因此,根据步骤的顺序,顺序列和每行的长度从一个文件更改为下一个文件。
因此file1为:
moo 100.35 blah 9 85 0.0038
moo 93.8 bluu 10 85 0.0042
和file2为:
125.2 129.3 moo 0.23
123.5 125.3 moo 0.23
,我想将其更改为:
1_horatio 100.35 blah 9 85 0.0038
2_horatio 93.8 bluu 10 85 0.0042
和
125.2 129.3 1_clarence 0.23
123.5 125.3 2_clarence 0.23
其中,moo的新名称上的数字对于每一行都是递增的。名称是输入变量。
这是我到目前为止一直在尝试的事情:
newnam=$1
awk -v nnam=$newnam 'BEGIN{ count=1 } {imgn=count"_"nam; print imgn,$2,$3,$4 count++ }' $2 > $3
然后我需要将其更改为:
newnam=$1
awk -v nam=$newnam 'BEGIN{ count=1 } {imgn=count"_"nam; print $1,$2,imgn,$4 count++ }' $2 > $3
我希望能够将列号作为变量,而不必担心有多少列。最多可以有50列,一百万行。
有没有办法在awk中做到这一点?还是用awk打击?
答案 0 :(得分:2)
我相信您可以做的就是这样,
awk '{$col=count"_"name; count++}1' name="clarence" col=3 <file>
在这里,我们使用以下awk功能:
$n
将重新定义$0
1
的意思是{print $0}
$expr
返回由expr
给出的字段编号 更新:计数器从1
开始,您可以将其重写为:
awk '{count++; $col=count"_"name}1' name="clarence" col=3 <file>
可以缩写为:
awk '{$col=++count"_"name}1' name="clarence" col=3 <file>
由于使用了预递增运算符++var
。但同样,现在count
类似于记录数,因此
awk '{$col=NR"_"name}1' name="clarence" col=3 <file>