다음 파일을 고려하십시오.
파일 1:
1
2
3
4
파일 2:
2
3
6
9
예상 출력:
1 NULL
2 2
3 3
4 NULL
NULL 6
NULL 9
시도해봤는데 paste file1 file2 | sed 's/\t/\0\t/g' | column -s $'\t' -t
원하는 효과가 나오지 않습니다.
답변1
comm 명령은 요구 사항에 가까운 형식으로 원하는 결과를 제공할 수 있습니다. 내 시스템에는 comm(GNU coreutils) 8.25가 기본적으로 설치되어 있습니다. 테스트를 위해 데이터와 추가 숫자를 포함하는 두 개의 파일 b 및 c txt를 만들었습니다.
comm --nocheck-order b.txt c.txt #(or file1.txt file2.txt)
산출:
1
2
3
4
6
8
9
10
11
13
16
17
18
19
20
22
첫 번째 열에는 파일 2와 일치하지 않는 파일 1의 항목이 포함되어 있습니다.
두 번째 열은 파일 1과 일치하지 않는 파일 2의 항목을 나타냅니다.
세 번째 열은 파일 1과 2의 공통/일치 항목을 나타냅니다.
파일이 정렬되어 있지만 어떤 이유로 comm이 정렬되지 않은 파일에 대해 불평합니다. --nocheck-order 스위치를 사용하여 이 문제를 해결할 수 있습니다.
목록은 사용자 정의 구분 기호로 형식을 지정할 수 있습니다(man comm 참조).
이제 목록을 작성했으므로 다음과 같이 조작할 수 있습니다.
readarray data < <(comm --nocheck-order --output-delimiter "-" b.txt c.txt)
for ((i=0;i<${#data[@]};i++)); do
va=$(grep -e "-" <<<"${data[$i]}")
if [[ $va == "" ]]; then
echo ${data[$i]} " null"
elif [[ $va == "--"* ]]; then
data2=$(echo ${data[$i]} | grep -Po '[0-9]*')
echo $data2 " " $data2
else
data2=$(echo ${data[$i]} | grep -Po '[0-9]*')
echo "null " $data2
fi
done
다른 흥미로운 명령으로는 Join 및 sdiff가 있지만 comm이 가장 가깝습니다. 다음 기사를 확인할 수도 있습니다. https://askubuntu.com/questions/515900/how-to-compare-two-files
인사