awk - 列4と5に一致する単語がある場合は、2番目の列を印刷します。

awk - 列4と5に一致する単語がある場合は、2番目の列を印刷します。

この5つの列を持つtxtファイルがあります。

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

ABD列4があり、列5がPOF上記の例と同じ場合は、列2の単語を印刷するテキストファイルの結果が必要です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の接続を一致させる2つの3文字の文字列接続と比較して少し簡単になります。

また、Archemarの回答から4つの重複コードブロックのうち3つを削除します(例{print $2}:)。バラより繰り返さないでください同じプログラムで同じコードの複数のコピーを避けるのが一般的に良い理由の簡単な要約です。


ABDとPOE、POJ、POBなど、入力に$ 4と$ 5の組み合わせがないと絶対に確信している場合いいえ一致させるには、4つの固定文字列一致の代わりに単一の正規表現一致を使用できます。

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

これは一致みんなリストされている4つの組み合わせだけでなく、ABの後にD、G、K、またはTが続き、POの後にF、E、J、またはBが続く組み合わせです。

関連情報