같은 열에 있는 유사한 파일 2개를 비교하고 싶습니다. 이러한 파일은 동일한 헤더를 갖습니다.
file1.txt
mem_id Date Time Building
aa bb cc dd
ee ff gg hh
ii jj kk ll
file2.txt
mem_id Date Time Building
aa bb cc dd
ee ff 2g hh
ii jj kk 2l
Command
awk 'NR==FNR{for(i=1;i<=NF;i++){A[i,NR]=$i}next} {for(i=1;i<=NF;i++){if(A[i,FNR]!=$i)\
{print "ID#-"$1": Column",i"- File1.txt value=",A[i,FNR]" / File2.txt value= "$i}}}'\
file1.txt file2.txt
Current Output
ID#-ee: Column 3- File1.txt value= gg / File2.txt value= 2g
ID#-ii: Column 4- File1.txt value= ll / File2.txt value= 2l
Desired Output
mem_id#-ee: Time- file1.txt value= gg / file2.txt value= 2g
mem_id#-ii: Building- file1.txt value= ll / file2.txt value= 2l
나는 매우 가깝습니다. 하지만 개선에 도움이 되었으면 좋겠습니다.
1-"열 3"과 "열 4"를 실제 열 헤더(시간, 건물 등)로 바꾸고 싶습니다.
2- 명령의 일부로 파일 이름을 추가하지 않고도 출력에서 파일 이름을 동적으로 수집하고 싶습니다(범용으로 만들기 위해).
3-이 스크립트가 가능하길 원합니다.
어떤 도움이라도 대단히 감사하겠습니다.
답변1
사용 awk
:
awk '
NR==1 {
for (i=1; i<=NF; i++)
header[i] = $i
}
NR==FNR {
for (i=1; i<=NF; i++) {
A[i,NR] = $i
}
next
}
{
for (i=1; i<=NF; i++)
if (A[i,FNR] != $i)
print "ID#-" $1 ": " header[i] "- " ARGV[1] " value= ", A[i,FNR]" / " ARGV[2] " value= "$i
}' file1.txt file2.txt
산출:
ID#-ee: Time- file1.txt value= gg / file2.txt value= 2g
ID#-ii: Building- file1.txt value= ll / file2.txt value= 2l
답변2
다음은 작업을 수행할 것으로 생각되는 스크립트입니다.
#! /bin/bash
FILE1=$1
FILE2=$2
[[ -z $FILE1 || -z $FILE2 ]] && echo "USAGE: $0 FILE1 FILE2" && exit 1
join -j 1 $FILE1 $FILE2 |
awk '
NR == 1 { for (i = 1; i <= NF; i++) { header[i] = $i; }; NCOLS = (NF - 1)/2; }
NR > 1 { for (i = 2; i <= NCOLS + 1; i++) { if ($i != $(i+NCOLS)) {print header[1]"#-"$1": "header[i]"- '$FILE1' value=",$i" / '$FILE2' value= "$(i+NCOLS) } } }
'
하나 신청했어요join
한 번에 다 읽을 수 있도록 말이죠.
를 사용하여 NR == 1
첫 번째 행을 배열로 읽어 나중에 다시 사용할 수 있도록 했습니다.
를 사용했기 때문에 join
두 파일에 모두 열이 있으면 n
결합된 출력에도 2n-1
열(병합에 사용된 열)이 있습니다. 그래서 공통 열을 제외한 열 수를 NCOLS
.