2009-11-17 60 views
1

我在文本文件temp1中有一些数据(用分号分隔)接近240行。 temp2.txt存储204行数据(用分号分隔)。使用shell脚本在2个文件中比较分号分隔的数据

我想:

  1. 排序两个文件中的数据通过field1,即每一行的第一个数据字段。
  2. 比较两个文件中的数据并重定向不同文件中不相等的行。

的样本数据:

temp1.txt 
1000xyz400100xyzA00680xyz0;19722.83;19565.7;157.13;11;2.74;11.00 
1000xyz400100xyzA00682xyz0;7210.68;4111.53;3099.15;216.95;1.21;216.94 
1000xyz430200xyzA00651xyz0;146.70;0.00;0.00;0.00;0.00;0.00 

temp2.txt 
1000xyz400100xyzA00680xyz0;19722.83;19565.7;157.13;11;2.74;11.00 
1000xyz400100xyzA00682xyz0;7210.68;4111.53;3099.15;216.95;1.21;216.94 

我使用sort命令:

sort -k1,1 temp1 -o temp1.tmp 
sort -k1,1 temp2 -o temp2.tmp 

我会很感激,如果有人能告诉我如何重定向只丢失/错误匹配行分成两个单独的文件进行分析。

回答

1

你想作为http://www.pixelbeat.org/cmdline.html#sets

sort -t';' -k1,1 temp1 temp1 temp2 | uniq -u > only_in_temp2 
sort -t';' -k1,1 temp1 temp2 temp2 | uniq -u > only_in_temp1 

说明中描述的区别:

  • 使用加入,而不是uniq的,截至如果你想只比较特定领域
  • 上面的链接显示如果第一个字段是固定宽度,那么你不需要-t';' -k1,1 params以上
+0

如果按字段1进行排序,是否需要指定字段? – 2009-11-17 11:28:16

+0

是的,因为我评论你需要指定字段边界iff字段不固定宽度 – pixelbeat 2009-11-17 11:45:00

+0

优秀的解决方案。感谢大家记下他们的投入。 – novice 2009-11-19 07:04:30

3

cat temp1 temp2 | sort -k1,1 -o tmp 
# mis-matching/missing rows: 
uniq -u tmp 
# matching rows: 
uniq -d tmp 
+1

你可以管入uniq并消除tmp文件,也可以使用'cat' - sort可以取多个文件:'sort temp1.txt temp2.​​txt | uniq -u' – 2009-11-17 11:22:48

+0

临时文件只是为了使用排序的数据两次,对于'uniq -u'和'uniq -d',并且'cat'不是必需的,是的。 – abbot 2009-11-17 19:10:08

0

使用GAWK,并输出file1中线不在file2中

awk -F";" 'FNR==NR{ a[$1]=$0;next } 
(! ($1 in a) ) { print $0 > "afile.txt" }' file2 file1 

交换file2中file2的和文件到输出线的顺序,是不是在文件1

尝试
+0

完整的解决方案来获取缺失的记录。谢谢 – novice 2009-11-19 07:06:24