【问题标题】:Append string to specific records in specific fields将字符串附加到特定字段中的特定记录
【发布时间】:2014-12-08 10:09:54
【问题描述】:

我有一个看起来像

的文件
No. 1 2 3 4 5
1 1 0 1 0 1
5 0 0 0 0 0
7 1 1 1 0 1
8 0 1 1 0 1
9 1 1 0 0 0
6 0 0 0 0 0
4 0 0 1 0 1

我想附加一个文本,让我们在第一行的所有项目前面说 var,除了前几个(比如 2,这个数字不同),这样我的文件看起来像

No. 1 var2 var3 var4 var5
1 1 0 1 0 1
5 0 0 0 0 0
7 1 1 1 0 1
8 0 1 1 0 1
9 1 1 0 0 0
6 0 0 0 0 0
4 0 0 1 0 1

我尝试在语句中使用 awk

awk '{ if(NR==1) for (i = 1; i <= NF; i++) 
 print  "var"$i; 
  for (j = 2; j <= NR; j++) print $0 }' input

但我没有得到预期的结果。有没有更简单的方法来做到这一点?

【问题讨论】:

    标签: bash shell unix awk scripting


    【解决方案1】:
    awk 'NR==1{for(i=3;i<=NF;i++) {$i = "var" $i}}1' File
    

    逻辑:

    `NR==1` => If Line 1, from 3rd field (`i=3`) to end of line (`i=NF`), change `i`th field to `varith field`.
    

    示例:

    ~$ cat File
    No. 1 2 3 4 5
    1 1 0 1 0 1
    5 0 0 0 0 0
    7 1 1 1 0 1
    8 0 1 1 0 1
    9 1 1 0 0 0
    6 0 0 0 0 0
    4 0 0 1 0 1
    ~$ awk 'NR==1{for(i=3;i<=NF;i++) {$i = "var" $i}}1' File
    No. 1 var2 var3 var4 var5
    1 1 0 1 0 1
    5 0 0 0 0 0
    7 1 1 1 0 1
    8 0 1 1 0 1
    9 1 1 0 0 0
    6 0 0 0 0 0
    4 0 0 1 0 1
    

    您可以根据需要更改i 的值。

    【讨论】:

    • awk 'NR==1{for(i=3;i&lt;=NF;i++) {$i = "var" $i}}1' File 和awk 1 *.xml 你能告诉我为什么我们在这两个命令中需要'1'吗?最后一个像cat *.xml
    • @zhujs:这里是用来打印所有记录的,即使是不受影响的……看看这里:backreference.org/2010/02/10/idiomatic-awk,你会更好理解。
    • 哦,非常感谢你
    • @A.M.D 我现在如何以不同的方式更改标签。从 2 到 5 为“患者 2”.. 从 6 到结尾为“Pat 6”。 awk 'NR==1{for(i=2;i
    • 你能显示整体预期输出吗?如果我理解正确,这对你有用: awk 'NR==1{for(i=2;i
    【解决方案2】:

    试试这条线:

    awk -v val=2 'NR==1{for(i=1;i<=NF;i++)$i=($i>=val?"var"$i:$i)}7' file
    

    将变量 val=2 更改为所需的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      相关资源
      最近更新 更多