특정 열에 동일한 값이 있는 탭으로 구분된 파일의 모든 행에 if 조건을 적용합니다.

특정 열에 동일한 값이 있는 탭으로 구분된 파일의 모든 행에 if 조건을 적용합니다.

기본적으로 열 2의 값이 동일한 행에 if 조건을 적용하고 싶습니다. 이 예에서 처음 3개 행의 열 2(Disease1)에는 동일한 값이 있습니다. 이제 이 세 행에 대해 IF 조건을 적용하고 싶습니다. 세 번째 열이 "높음"이면 해당 행만 출력 파일에 씁니다. 세 번째 열에 "high"가 없으면 "medium"을 찾아서 인쇄하세요. "medium"도 없으면 "low" 값이 포함된 행이 인쇄됩니다.

입력하다:

id1 Disease1 High
id2 Disease1 Medium
id3 Disease1 Low
id4 Disease2 Low
id5 Disease3 Medium
id6 Disease3 Low

예상 출력:

id1 Disease1 High
id4 Disease2 Low
id5 Disease3 Medium

답변1

awk 'BEGIN { FS=OFS="\t"; d["High"]=1; d["Medium"]=2; d["Low"]=3 } { print d[$3], $0 }' file |
sort -t $'\t' -k3,3 -k1,1n | sort -t $'\t' -s -u -k3,3 | cut -f 2-

불행하게도 "High", "Medium" 및 "Low"라는 단어는 이 순서대로 알파벳순으로 정렬되지 않으므로 3열의 해당 단어에 대해 각 행 앞에 정수 1, 2, 3을 추가합니다. awk스크립트. 이 정수는 원본 콘텐츠와 탭으로 구분되어 있으며 질병의 심각도를 나타냅니다(1이 가장 높음).

그런 다음 해당 정수 필드에 대한 질병 및 수정 데이터를 정렬하여 기록이 질병별로 그룹화되고 심각도별로 정렬되도록 합니다.

그런 다음 질병만을 핵심으로 sort"고유하게 순위를 지정"합니다 (두 번째). 이는 중복된 질병을 모두 삭제하고 각 질병에 대해 가장 심각한 기록만 보관합니다. 동일한 키를 가진 레코드의 재정렬을 유지하는 안정적인 정렬 알고리즘을 사용합니다 -s.sort

마지막 cut것은 이전에 추가한 정수를 제거합니다 awk.

파이프는 명령을 지정 하는 데 사용되는 bash필드 구분 기호를 가정합니다 sort. 사용되지 않는 경우 bash, 사용하는 대신 작은따옴표 리터럴 탭을 삽입하십시오 $'\t'(아마도 를 눌러 이 작업을 수행할 수 있습니다 Ctrl+V Tab).

답변2

각 Id(초) 열의 우선순위가 항상 높은 것에서 낮은 경우 다음을 통해 쉽게 수행할 수 있습니다.

sort -u -k2,2 infile

그렇지 않으면 다음과 같이 할 수 있습니다.

sed 's/High$/1/; s/Medium$/2/; s/Low$/3/' infile \
| sort -k2,3  \
| sort -uk2,2 \
| sed 's/1$/High/; s/2$/Medium/; s/3$/Low/'

아니면 그냥 awk:

awk '{ pr[$2]=($3=="High"?$3:(pr[$2]=="High"?pr[$2]:(pr[$2]=="Medium"?pr[$2]:$3)));
       if (temp!=pr[$2]) { id[$2]=$0; temp=pr[$2] }
} END { for (key in id) print id[key] }' infile

답변3

저는 Perl을 사용하여 이 해시를 생성할 파서를 구축하겠습니다.

  • 2열 값을 키로 사용
  • 키에 해당하는 첫 번째 행은 해당 키의 값을 구성합니다.
  • 값을 설정한 후에는 키의 다른 모든 행을 건너뜁니다.

구문 분석이 완료되면 해시를 인쇄하고 필요한 경우 두 번째 토큰을 정렬합니다.

답변4

그냥 어이없어

awk '
    BEGIN {prio["High"]=1; prio["Medium"]=2; prio["Low"]=3}
    !($2 in p) || prio[$3] < p[$2] {p[$2] = prio[$3]; line[$2] = $0}
    END {for (key in line) print line[key]}
' file
id1 Disease1 High
id4 Disease2 Low
id5 Disease3 Medium

관련 정보