file1.csv와 file2.csv라는 두 개의 파일이 있습니다.
다음은 file1.csv의 내용이다.
AL.jar;d8c06ebedd7954681f34ab5c94fdc4fb
AR.jar;9a553dd203d0979aa60004e19cc98c12
BI.jar;8022f6c5f83ba040394ff0b0a0323e8e
BV.jar;f53c4a8c988aa8806b54063ebc682803
CaseUtilities.jar;e5f653d899298f5e5d56f357b6f781c5
CO.jar;b2f7a0ab6e646d6793631e5c97e05096
파일 2.csv
AL.jar;d8c06ebedd7954681f34ab5c94fdc4fb
AR.jar;4e6e584dd852684ba21ae63990e2a1a6
BV.jar;213d9df82095764702ef4929424a1a0c
CaseUtilities.jar;5b787f1f3d57922bd980ebbfe9a5343e
CO.jar;cfb994078ff4373c7e0f15de19830a3d
Common.jar;a09b520288870aa3888194ce59179dbd
내용을 기준으로 두 파일을 비교해야 합니다.
첫 번째 열의 값만을 기준으로 diff를 만들고 싶으므로 결과는 다음과 같아야 합니다.
AL.jar;d8c06ebedd7954681f34ab5c94fdc4fb AL.jar;d8c06ebedd7954681f34ab5c94fdc4fb
AR.jar;9a553dd203d0979aa60004e19cc98c12 AR.jar;4e6e584dd852684ba21ae63990e2a1a6
BI.jar;8022f6c5f83ba040394ff0b0a0323e8e <NULL>
BV.jar;f53c4a8c988aa8806b54063ebc682803 BV.jar;213d9df82095764702ef4929424a1a0c
CaseUtilities.jar;e5f653d899298f5e5d56f357b6f781c5 CaseUtilities.jar;5b787f1f3d57922bd980ebbfe9a5343e
CO.jar;b2f7a0ab6e646d6793631e5c97e05096 CO.jar;cfb994078ff4373c7e0f15de19830a3d
<NULL> Common.jar;a09b520288870aa3888194ce59179dbd
나는 다음 명령을 시도했습니다
diff -y file1.csv file2.csv
그러나 아래 출력은 예상과 다릅니다.
AL.jar;d8c06ebedd7954681f34ab5c94fdc4fb AL.jar;d8c06ebedd7954681f34ab5c94fdc4fb
AR.jar;9a553dd203d0979aa60004e19cc98c12 | AR.jar;4e6e584dd852684ba21ae63990e2a1a6
BI.jar;8022f6c5f83ba040394ff0b0a0323e8e | BV.jar;213d9df82095764702ef4929424a1a0c
BV.jar;f53c4a8c988aa8806b54063ebc682803 | CaseUtilities.jar;5b787f1f3d57922bd980ebbfe9a5343e
CaseUtilities.jar;e5f653d899298f5e5d56f357b6f781c5 | CO.jar;cfb994078ff4373c7e0f15de19830a3d
CO.jar;b2f7a0ab6e646d6793631e5c97e05096 | Common.jar;a09b520288870aa3888194ce59179dbd
내 예상 출력을 달성하는 방법을 알고 싶습니다!
답변1
awk -F "\"*;\"*" '{print $1}' file1.csv > file1 # get first column from file1.csv with awk as stream and redirect to file1 var
awk -F "\"*;\"*" '{print $1}' file2.csv > file2 # get first column from file2.csv with awk as stream and redirect to file2 var
diff -y file1 file2 # diff file1 and file2 bash vars
또는 단일 명령과 동일합니다.
diff -y <(awk -F "\"*;\"*" '{print $1}' file1.csv) <(awk -F "\"*;\"*" '{print $1}' file2.csv)
결과:
AL.jar AL.jar
AR.jar AR.jar
BI.jar <
BV.jar BV.jar
CaseUtilities.jar CaseUtilities.jar
CO.jar CO.jar
| Common.jar
답변2
또 다른 방법은 다음을 사용하는 것입니다 join
. column
파일이 예제에 따라 정렬되어 있으면...
join -t\; -e "<NULL>" -a 1 -a 2 -o 1.1 1.2 2.1 2.2 file1 file2 | column -t -s\;
산출
AL.jar d8c06ebedd7954681f34ab5c94fdc4fb AL.jar d8c06ebedd7954681f34ab5c94fdc4fb
AR.jar 9a553dd203d0979aa60004e19cc98c12 AR.jar 4e6e584dd852684ba21ae63990e2a1a6
BI.jar 8022f6c5f83ba040394ff0b0a0323e8e <NULL> <NULL>
BV.jar f53c4a8c988aa8806b54063ebc682803 BV.jar 213d9df82095764702ef4929424a1a0c
CaseUtilities.jar e5f653d899298f5e5d56f357b6f781c5 CaseUtilities.jar 5b787f1f3d57922bd980ebbfe9a5343e
CO.jar b2f7a0ab6e646d6793631e5c97e05096 CO.jar cfb994078ff4373c7e0f15de19830a3d
<NULL> <NULL> Common.jar a09b520288870aa3888194ce59179dbd
join
기본 동작은 첫 번째 필드를 연결하는 것이므로 -t\;
두 파일의 모든 불일치를 포함하도록 구분 기호를 설정 -a 1 -a 2
하고 빈 필드를 채운 -e "<NULL>"
다음 출력 필드를 지정하면 됩니다 -o ......
.
join
출력에는 동일한 구분 기호가 있으므로 column -t
파이프를 통해 동일한 구분 기호를 사용하여 인쇄 형식을 지정합니다.
출력은 덜 정확하지만 입력 횟수는 적습니다...
답변3
awk에서는 언제든지 이 작업을 수행할 수 있습니다.
$ awk -F';' '{
if(NR==FNR){a[$1]=$0}
else{b[$1]=$0}
ids[$1]++;
}
END{
for(id in ids){
printf "%s\t%s\n",a[id],b[id];
}
}' file1.csv file2.csv | column -t
CO.jar;b2f7a0ab6e646d6793631e5c97e05096 CO.jar;cfb994078ff4373c7e0f15de19830a3d
BV.jar;f53c4a8c988aa8806b54063ebc682803 BV.jar;213d9df82095764702ef4929424a1a0c
Common.jar;a09b520288870aa3888194ce59179dbd
AL.jar;d8c06ebedd7954681f34ab5c94fdc4fb AL.jar;d8c06ebedd7954681f34ab5c94fdc4fb
AR.jar;9a553dd203d0979aa60004e19cc98c12 AR.jar;4e6e584dd852684ba21ae63990e2a1a6
BI.jar;8022f6c5f83ba040394ff0b0a0323e8e
CaseUtilities.jar;e5f653d899298f5e5d56f357b6f781c5 CaseUtilities.jar;5b787f1f3d57922bd980ebbfe9a5343e
또는 NULL
샘플 출력에서 다음을 포함합니다.
$ awk -F';' '{
if(NR==FNR){
a[$1]=$0;
b[$1]="<NULL>"
}
else{
b[$1]=$0;
a[$1] = a[$1] ? a[$1] : "<NULL>";
}
ids[$1]++;
}
END{
for(id in ids){
printf "%s\t%s\n",a[id],b[id];
}
}' file1.csv file2.csv | column -t
CO.jar;b2f7a0ab6e646d6793631e5c97e05096 CO.jar;cfb994078ff4373c7e0f15de19830a3d
BV.jar;f53c4a8c988aa8806b54063ebc682803 BV.jar;213d9df82095764702ef4929424a1a0c
<NULL> Common.jar;a09b520288870aa3888194ce59179dbd
AL.jar;d8c06ebedd7954681f34ab5c94fdc4fb AL.jar;d8c06ebedd7954681f34ab5c94fdc4fb
AR.jar;9a553dd203d0979aa60004e19cc98c12 AR.jar;4e6e584dd852684ba21ae63990e2a1a6
BI.jar;8022f6c5f83ba040394ff0b0a0323e8e <NULL>
CaseUtilities.jar;e5f653d899298f5e5d56f357b6f781c5 CaseUtilities.jar;5b787f1f3d57922bd980ebbfe9a5343e
답변4
awk 'FNR==NR{arr[$0]=1;next} !arr[$0]{print}' checkagainst.csv sourcefile.csv > testinationfile.csv