【问题标题】:bash working on multiple columns in same filebash 处理同一文件中的多个列
【发布时间】:2013-11-27 12:50:55
【问题描述】:

我在比较同一文件的两列然后根据另一列替换一列的值时遇到问题

例如,我的文件是这样的:

name col1  col2
abc  no    no
xyz  yes   yes
man  no    no
wrr  no    no

在这里,我想检查文件 col1 中的每个“否”值,我想将 col2 的值更改为“N/A”

【问题讨论】:

    标签: bash shell


    【解决方案1】:
    $ awk '$2=="no"{$3="N/A"}1' file
    name col1  col2
    abc no N/A
    xyz  yes   yes
    man no N/A
    wrr no N/A
    

    【讨论】:

    • 你能详细说明一下吗? 1 最后做了什么?
    • 这是一种显示当前行的神秘方式。我真的应该把 {print} 放在可读性上,但我试图尽可能简洁。
    • 我认为字段分隔符是\t,而不是简单的空格。所以在这种情况下你应该使用 -F 选项。
    • @IdrissNeumann 你好,伊德里斯!除非空格确实出现在列值中,否则这不是必需的,而发布的数据并非如此。 awk 默认将空格和制表符都视为字段分隔符。
    【解决方案2】:

    这是一个 awk 问题:

    cat your-file.txt | awk '{if ( $2 == "no" ) { $3 = "N/A"; } print $0 }' > your-new-file.txt
    

    【讨论】:

    • 旧习惯... awk 很少是管道中唯一的流编辑器;)
    • cat 即使您使用多个管道也很少有用;)
    【解决方案3】:

    这是一个简单的解决方案:

    while read name col1 col2 ; do
       if[[ "$col" = no ]]; then
          echo "$name $col1 N/A"
       else
          echo "$name $col1 $col2"
       fi
    done < file
    

    如果您需要更快,请使用此awk 脚本:

    $1 == "no" { print $1" "$2" N/A"; next; }
    { print; }
    

    【讨论】:

      【解决方案4】:

      使用sed

      [ ~]$ sed "s/\([A-Za-z]*\ *no\ *\).*/\1N\/A/g" file
      name col1  col2
      abc  no    N/A
      xyz  yes   yes
      man  no    N/A
      wrr  no    N/A
      

      使用awk

      [ ~]$ awk '$2 == "no" {$3="N/A"} {print}' file
      name col1  col2
      abc no N/A
      xyz  yes   yes
      man no N/A
      wrr no N/A
      

      您还可以根据需要更改显示:

      [ ~]$ awk '$2 == "no" {$3="N/A"} {print $1"\t"$2"\t"$3}' file
      [ ~]$ awk '$2 == "no" {$3="N/A"} {print $1" "$2" "$3}' file
      # ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-15
        • 2013-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多