비슷한 데이터가 포함된 파일이 3개 있습니다. 나는 3개의 파일을 읽고 해당 값과 함께 고유한 항목을 출력할 수 있는 bash 스크립트를 원합니다. 예:
1.txt
aceE 14
aceF 8
adhE 20
asnS 2
carB 2
dnaK 3
eno 2
2.txt
aceE 11
aceF 7
acnB 2
acrB 1
adhE 22
asnS 2
dapD 3
3.txt
aceE 16
aceF 10
adhE 18
aroK 2
asnS 3
dapD 4
dnaK 4
따라서 출력은 다음과 같아야 합니다.
acnB 2
acrB 1
aroK 2
carB 2
eno 2
답변1
GNU uniq
또는 호환 가능( -w
옵션의 경우):
sort {1,2,3}.txt | uniq -u -w5
acnB 2
acrB 1
aroK 2
carB 2
eno 2
편집: 첫 번째 필드의 길이를 좀 더 유연하게 만들기 위해 Guillermo의 접근 방식 중 일부를 구현할 수 있습니다.
grep -f <(sort {1,2,3}.txt | cut -d' ' -f1 | uniq -u) <(sort {1,2,3}.txt)
결과적으로 입력 파일의 구분 기호는 <tab>
이고 가 아닙니다 <space>
. 입력 파일을 질문에 붙여넣어 변경되었습니다. :-(
그럼에도 불구하고 이것은 <tab>
.
grep -f <(sort {1,2,3}.txt | cut -f1 | uniq -u) <(sort {1,2,3}.txt)
답변2
나는 이것을 제안한다:
sort {1,2,3}.txt | cut -d' ' -f1 | uniq -u | xargs -I '{}' grep -h "{}" {1,2,3}.txt
파일 내용을 정렬합니다.
sort {1,2,3}.txt
첫 번째 열만 출력합니다.
cut -d' ' -f1
고유 항목 필터링:
uniq -u
acnB
acrB
aroK
carB
eno
출력 피드 사용 grep
:
xargs -I '{}' grep -h "{}" {1,2,3}.txt
acnB 2
acrB 1
aroK 2
carB 2
eno 2
답변3
와 함께 awk
:
awk '
n[$1]++ {delete s[$1]; next}
{s[$1] = $0}
END {for (i in s) print s[i]}' [123].txt
답변4
밀러(https://github.com/johnkerl/miller) 그리고 실행 중
mlr --csv --fs "\t" -N count-similar -g 1 then filter '$count==1' then cut -x -f count 1.txt 2.txt 3.txt
당신은 할 것
carB 2
eno 2
acnB 2
acrB 1
aroK 2