【问题标题】:Match and substitute elements using AWK使用 AWK 匹配和替换元素
【发布时间】:2014-07-08 04:29:21
【问题描述】:

我有一个直截了当的问题。如果“文件”的第一列(ID)中的元素与“子文件”的第一列(ID)的元素匹配,则“文件”的匹配元素应替换为“子文件”的第二列(即符号)的元素”。

我可以使用“AWK”匹配“文件”和“子文件”中的“ID”,但是用相应的“符号”替换匹配的元素时遇到了麻烦。

请有任何建议。

我为匹配 ID 编写的脚本是:

awk 'FNR==NR {a[$1]=$1;next} 1' subfile file

子文件:

"ID"    "Symbol"
"204639_at" "ADA"
"204212_at" "ACOT8"
"209027_at" "ABI1"
"202382_at" "GNPDA1"

文件

"ID"        "x"  "y"   "z"
"204639_at" 1.22  2.33  4.66
"204212_at" 3.55  5.78  4.78
"209027_at" 4.77  3.21  9.30
"202382_at" 9.66  9.08  1.43 

我需要的输出如下:

         x      y        z

ADA     1.22    2.33    4.66
ACOT8   3.55    5.78    4.78
ABI1    4.77    3.21    9.3
GNPDA1  9.66    9.08    1.43

【问题讨论】:

    标签: regex awk


    【解决方案1】:

    使用join:

    join -j 1 FILE SUBFILE -o 2.2,1.2,1.3,1.4 | \
        sed 's/Symbol//;s/"//g;s/  */:/g' | column -t -s:
    

    给予:

            x     y     z
    ADA     1.22  2.33  4.66
    ACOT8   3.55  5.78  4.78
    ABI1    4.77  3.21  9.30
    GNPDA1  9.66  9.08  1.43
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      awk 'FNR==NR {a[$1]=$2;next} {$1=a[$1]}1' subfile file
      "Symbol" "x" "y" "z"
      "ADA" 1.22 2.33 4.66
      "ACOT8" 3.55 5.78 4.78
      "ABI1" 4.77 3.21 9.30
      "GNPDA1" 9.66 9.08 1.43
      

      或者一些格式化的:

      awk 'FNR==NR {a[$1]=$2;next} {$1=a[$1];gsub(/\"/,"");gsub(/Symbol/,"")}1' OFS="\t" subfile file
              x       y       z
      ADA     1.22    2.33    4.66
      ACOT8   3.55    5.78    4.78
      ABI1    4.77    3.21    9.30
      GNPDA1  9.66    9.08    1.43
      

      【讨论】:

      • @Jidder 你错了。它将subfile 存储在名为a 的数组中,使用$1 作为索引,$2 作为值。然后当它在file 中查找时,它会从file 中获取$1 的值,并在数组a 中使用它作为查找。如果找到匹配项,则将其返回并将其存储回$1 ($1=a[$1]) 只需尝试交换subfile 中的一些行,您仍然会得到相同的结果。
      • 虽然我感到困惑的原因是我认为您正在为第一个文件中的每一行分配$1 $1=a[$1] 给自己,因为我看不到下一个。
      • 此外,如果第一个字段不匹配,它将不会保留那里的内容并打印一个空白字段
      • @Jidder 可以通过测试数组轻松修复,同时设置$1 像这样$1=a[$1]?a[$1]:$1,但 OP 没有提到需要它。
      猜你喜欢
      • 2016-08-27
      • 2013-06-01
      • 2022-01-15
      • 1970-01-01
      • 2021-07-02
      • 2017-09-06
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多