Linux에서 대용량 데이터가 포함된 파일을 정렬 및 연결하고, 찾을 수 없는 값은 빈 값으로 출력하는 방법

Linux에서 대용량 데이터가 포함된 파일을 정렬 및 연결하고, 찾을 수 없는 값은 빈 값으로 출력하는 방법

다음 파일을 고려하십시오.

파일 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

인사

관련 정보