awk - 如果第 4 列和第 5 列有匹配的单词,则打印第二列

awk - 如果第 4 列和第 5 列有匹配的单词,则打印第二列

我有一个包含 5 列的 txt 文件,例如这样

F1 rsfldo4pw F5 ABC  POG
F2 rsfcl2eou F6 ABD  POF
F3 rsfceleou F7 ABG  POE

ABD我想要一个文本文件的结果,如果第 4 列是,第 5 列是 ,则打印第 2 列中的单词POF,就像上面的示例一样,它应该打印 rsfcl2eou

我使用了这段代码,但它不起作用,你能帮忙纠正一下吗?

'{if ( ($4=="ABD" && $5=="POF") 
    || ($4=="ABG" && $5=="POE") 
    || ($4=="ABK" && $5=="POJ") 
    || ($4=="ABT" && $5=="POB"))  print $2, "eltext" ;
  else print $2;}' ${DataFile.txt} |
 grep -v eltex > ${tempo.txt}

答案1

根据列过滤行

awk '$4 == "ABC" && $5 == "DEF" ' 

仅打印字段 2

awk '$4 == "ABC" && $5 == "DEF" { print $2} ' 

具有多个条件

awk '$4 == "ABC" && $5 == "DEF" { print $2} 
     $4 == "XYZ" && $5 == "GHI" { print $2} ' 

不匹配条件的行将被忽略,不需要额外的grep -v


重定向和变量

请注意, ${datafile.txt}不会扩展到datafile.txt

使用任一

awk '... ' input.txt > output.txt

或者

input="Datafile.txt"
output="Exportfile.txt"
awk '...' ${input} > ${output}

你可能想要引用变量,以防有特殊字符

awk '...' "${input}" > "${output}"

答案2

awk '(($4 " " $5 == "ABD POF") ||
      ($4 " " $5 == "ABG POE") ||
      ($4 " " $5 == "ABK POJ") ||
      ($4 " " $5 == "ABT POB")) { print $2 }' DataFile.txt > exportfile.txt

通过将 $4 和 $5 的串联与要匹配它们的两个 3 字母字符串的串联进行比较,这稍微简化了它。

它还消除了 Archemar 答案中 4 个重复代码块中的 3 个(即{print $2})。看不要重复自己快速总结为什么避免同一程序中相同代码的多个副本通常是一种好的做法。


如果您绝对确定输入中不存在任何 $4 和 $5 的组合,例如 ABD 以及 POE、POJ 或 POB 等,那么您想要匹配,您可以使用单个正则表达式匹配而不是四个固定字符串匹配:

awk '$4 " " $5 ~ /^AB[DGKT] PO[FEJB]$/ {print $2}' DataFile.txt  > exportfile.txt

这将匹配全部AB 后跟 D、G、K 或 T 的组合以及 PO 后跟 F、E、J 或 B 的组合,而不仅仅是您列出的 4 种组合。

相关内容