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

Posted

技术标签:

【中文标题】awk 更改文件中的一列,其中列更改不同文件中的位置【英文标题】:awk change one column in file, where column changes position in different files 【发布时间】:2018-09-07 16:43:49 【问题描述】:

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

所以 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 列,最多可以有 100 万行。

有没有办法在 awk 中做到这一点?还是用 awk bash?

【问题讨论】:

【参考方案1】:

我相信你能做的就是这样,

awk '$col=count"_"name; count++1' name="clarence" col=3 <file>

这里我们使用了以下 awk 特性:

重新定义字段$n 将重新定义$0 命令1 表示print $0 运算符$expr返回expr给出的字段号

更新:让计数器从 1 开始,可以将其重写为:

awk 'count++; $col=count"_"name1' name="clarence" col=3 <file>

可以简写为:

awk '$col=++count"_"name1' name="clarence" col=3 <file>

由于使用了预增运算符++var。但同样,现在count 与记录数相似,因此

awk '$col=NR"_"name1' name="clarence" col=3 <file>

【讨论】:

太棒了。这正是我所需要的。 $col=count"_"name; count++ 将在第一行打印 count 的空值,而不是 1。您应该改用$col=++count"_"name 或更好的$col=NR"_"name 没错,但它对我有用,因为我在 Begin 部分初始化了计数。

以上是关于awk 更改文件中的一列,其中列更改不同文件中的位置的主要内容,如果未能解决你的问题,请参考以下文章

使用 awk 将大型、复杂的一列文件拆分为多列

如何计算bash中一列数据中的连续重复次数?

利用awk命令提取其中一列包括特定字符的所有行怎么办

AWK&SED

根据另一列中的更改创建带有时间戳的最后修改列

Oracle Apex - 更改图表标签