파일이 2개 있는데,
파일 1->
1
2
2
3
5
파일 2->
1
3
2
6
file3이라는 세 번째 파일에 출력을 저장하고 싶습니다.
1,1,Match
2,2,Match
2,,NoMatch
3,3,Match
5,,NoMatch
,6,NoMatch
나는 노력했다.
sort file1 > file1sorted.txt
sort file2 > file2sorted.txt
# Combine the sorted files with a comma and store it in a new file
paste -d ',' file1sorted.txt file2sorted.txt > mergedsortedfile.txt
# Compare the columns and store the result in a new file
awk -F',' '{print $1 == $2 ? "MATCH" : "NO MATCH"}' mergedsortedfile.txt > result.txt
# Merge the result file with the already existing merged file
paste -d ', ' mergedsortedfile.txt result.txt > final_result.txt
결과는 다음과 같습니다.
1,1,MATCH
2,2,MATCH
2,3,NO MATCH
3,6,NO MATCH
5,,NO MATCH
답변1
comm
정렬된 데이터 사용 :
$ comm <( sort -n file1 ) <( sort -n file2 )
1
2
2
3
5
6
이 출력은 탭으로 구분됩니다. 열 1과 2의 모든 항목을 "NoMatch"로 표시하고 열 3의 모든 항목을 "Match"로 표시할 수 있습니다 awk
.
$ comm <( sort -n file1 ) <( sort -n file2 ) |
awk -F$'\t' 'BEGIN { OFS="," } $3 { print $3, $3, "Match"; next } { print $1, $2, "NoMatch" }'
1,1,Match
2,2,Match
2,,NoMatch
3,3,Match
5,,NoMatch
,6,NoMatch
스크립트 awk
는 탭으로 구분된 입력( )을 읽고 -F$'\t'
쉼표를 출력 필드 구분 기호( OFS=","
)로 사용합니다. 필드 3에 뭔가가 있으면 Match
필드 3에 두 번 출력되고 다음 줄로 계속됩니다. 그렇지 않으면 필드 1과 2, 그리고 input 의 NoMatch
세 번째 필드를 출력합니다.
답변2
이 Perl 스크립트를 xxx 파일로 저장하고 실행하십시오.perl xxx file1 file2
#!/usr/bin/perl
# save the first two files, the <> slurp clears @ARGV
($f1,$f2) = @ARGV;
# build a hash of hash of lines from all files,
# with the filename as key
do { chomp; push @{$hash{$ARGV}}, $_ } while <>;
# compare every line until both are empty
# the hash slice is a short expression for
# $a = $hash{$f1}->[$x]
# $b = $hash{$f2}->[$x]
for ($x=0;;$x++) {
($a,$b) = map { $$_[$x] } @hash{$f1,$f2};
last unless $a or $b;
printf "%s,%s,%s\n", $a, $b, $a eq $b ? 'Match' : 'NoMatch';
}