awk更改文件中的一列,其中列更改不同文件中的位置

时间:2018-09-07 16:43:49

标签: bash awk

我有多个处理步骤产生的文本文件,因此,根据步骤的顺序,顺序列和每行的长度从一个文件更改为下一个文件。

因此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打击?

1 个答案:

答案 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>