필드의 각 값에 대해 일련의 명령을 실행합니다.

필드의 각 값에 대해 일련의 명령을 실행합니다.

TSV 파일이 있습니다. 열 5의 특정 값에 대해 모든 행을 추출한 다음 세 개의 열을 잘라낸 다음 고유한 행 수를 계산하려고 합니다. 예를 들어, 열 5의 문자열 "abc"에 대해 다음을 원합니다.

awk '$5 == "abc"' file.tsv | cut -f 1-3 | sort -u | wc -l

하지만 "abc"뿐만 아니라 열 5의 모든 고유 문자열에 대해 이 작업을 수행하고 싶습니다. "for i in $5" 같은 것이 있어야 하는데, 저는 이 "for 루프"를 잘 이해하지 못합니다. 문자열이 너무 많아서 개별 명령을 내릴 수 없습니다.

여기에 이미지 설명을 입력하세요.

답변1

그러면 예상된 결과가 인쇄됩니다.

cut -f 1-3,5 file.tsv | sort -u | cut -f 4 | sort | uniq -c | awk '{ print $2, $1; }'

설명하다:

cut -f 1-3,5 file.tsv관련 열 1, 2, 3, 5 추출
sort -u고유 조합 가져오기
cut -f 4현재 열 4에 있는 원래 5번째 열 값만 추출
sort | uniq -c고유 값 정렬 및 계산
awk '{ print $2 "\t" $1; }'열 교환 및 출력 형식 지정

답변2

당신은 다음과 같은 것을 원하는 것 같습니다

awk '{test[$5" "$1" "$2" "$3]++}END{for (t in test) print t}' file1 | cut -d' ' -f1 | sort | uniq -c

걸어 다녔다

test[$5" "$1" "$2" "$3]++ #populates an array with unique combinations of these fields
for (t in test) print t   #print each unique array index (field combination) once to STDOUT
cut -d' ' -f1             #extract what was the original 5th field
sort                      #yes, yes OK @Bodo
uniq -c                   #count the number of times it appears

산출

2 abc
1 def

편집하다

@Bodo의 손에 패배를 인정하면서도, awk실행 가능한 해결책을 찾으려는 의지는 남아서, 이 추악한 짐승을 바칩니다…

awk '!test[$5" "$1" "$2" "$3]{out[$5]++;test[$5" "$1" "$2" "$3]++}
  END
  {for (o in out) print o, out[o]}' file1

관련 정보