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 更改文件中的一列,其中列更改不同文件中的位置的主要内容,如果未能解决你的问题,请参考以下文章