我有一个包含 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 种组合。