【问题标题】:awk change one column in file, where column changes position in different filesawk 更改文件中的一列,其中列更改不同文件中的位置
【发布时间】: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?

【问题讨论】:

    标签: bash awk


    【解决方案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"_"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>
    

    【讨论】:

    • 太棒了。这正是我所需要的。
    • $col=count"_"name; count++ 将在第一行打印 count 的空值,而不是 1。您应该改用$col=++count"_"name 或更好的$col=NR"_"name
    • 没错,但它对我有用,因为我在 {Begin} 部分初始化了计数。
    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    相关资源
    最近更新 更多