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