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

  • 本文关键字:文件 位置 awk 一列 bash awk
  • 更新时间 :
  • 英文 :


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

所以文件1将是:

moo 100.35  blah  9  85 0.0038
moo 93.8    bluu 10  85 0.0042

文件2将是:

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 '{$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>

最新更新