我有由各种处理步骤生成的文本文件,因此根据步骤的顺序,顺序列和每行长度从一个文件更改为下一个文件。
所以文件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>