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가 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의 연결을 일치시키려는 두 개의 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가 오는 조합입니다.

관련 정보