Text-Processing
比較 2 個製表符分隔的文件和輸出差異與列標題
我想在一個共同的列上比較 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-我想要這個腳本。
任何幫助,將不勝感激。
使用
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
這是我認為可以完成工作的腳本:
#! /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
.