有两个文件需要比较前两列。
输入文件示例1:
|CID|SID|order|orderdate|confirmdate
|151244127820|7177638911583| 2|2015-02-04 07:14:44|2015-02-04 07:15:32
|151244127820|7177638922976| 4|2015-02-04 07:16:19|2015-02-04 07:19:47
|151244127824|7177638920385| 2|2015-02-04 07:14:22|2015-02-04 07:18:48
|151244127824|7177638924073| 3|2015-02-04 07:18:40|2015-02-04 07:20:11
|151244127825|7177638921040| 1|2015-02-04 07:12:58|2015-02-04 07:19:02
|151244127827|7177638917056| 2|2015-02-04 07:14:17|2015-02-04 07:17:31
|151244127827|7177638968972| 3|2015-02-04 07:17:36|2015-02-04 07:36:22
输入文件2:
|cID|SID|order|orderdate|confirmdate
|151244127820|7177638911583| 2|2015-02-04 07:14:44|2015-02-04 07:15:32
|151244127820|7177638922976| 4|2015-02-04 07:16:19|2015-02-04 07:19:47
|151244127834|7177638920385| 2|2015-02-04 07:14:22|2015-02-04 07:18:48
|151244127834|7177638924073| 3|2015-02-04 07:18:40|2015-02-04 07:20:11
|151244126585|7177638921040| 1|2015-02-04 07:12:58|2015-02-04 07:19:02
|151244126585|7177638917056| 2|2015-02-04 07:14:17|2015-02-04 07:17:31
|151244127827|7177638968970| 3|2015-02-04 07:17:36|2015-02-04 07:36:22
如果在 file1 中找不到输入 file2 中的 CID,则将完整行写入新文件中。如果在 file1 中找到输入 file2 中的 CID,但未找到 SID,则将完整行写入新文件中。
答案1
awk -F'|' 'FNR==NR{a[$2]=$2;b[$3]=$3;next};{if($2 in a){print $0 > "new_file_1"};if(($2 in a )&& !($3 in b)){print $0 > "new_file_2"}} file1 file2
细节 ...
{if($2 in a){print $0 > "new_file_1"} : if SID in file2 matches SID in file1 redirect to a file called new_file_1
..
if(($2 in a )&& !($3 in b)){print $0 > "new_file_2"} :if SID in file2 matches SID in file1 but CIDs does not match, redirect to a file called new_file_2
答案2
awk -F'|' '
FNR==NR{
cid[$2]=1
sid[$3]=1
next
}
{
if (!($2 in cid))
print
else
if (!($3 in sid))
print
}' file1 file2
简要说明:
从第一个文件构建两个唯一的数组(cid
和值)。sid
然后将其与第二个文件每行的第二个和第三个字段(第一个字段从行首到第一个分隔符计数,因此它为空)进行比较,并根据条款打印行。
答案3
我认为这得到了你想要的:
for n in 3 0
do nl -w1 -s."$n" <&"$n"
done 3<file1 <file2 |
sort -t\| -unk2,2 -nk3,3 |
sort -t\| -nk1,1 |
grep '^[^|]*0|'
...在我的测试中打印...
4.0|151244127834|7177638920385| 2|2015-02-04 07:14:22|2015-02-04 07:18:48
5.0|151244127834|7177638924073| 3|2015-02-04 07:18:40|2015-02-04 07:20:11
6.0|151244126585|7177638921040| 1|2015-02-04 07:12:58|2015-02-04 07:19:02
7.0|151244126585|7177638917056| 2|2015-02-04 07:14:17|2015-02-04 07:17:31
8.0|151244127827|7177638968970| 3|2015-02-04 07:17:36|2015-02-04 07:36:22
看——这不仅非常简单(即使对于非常大的输入也可能非常快)- 但你甚至可以保留行号。但如果您不想要它们,您可以附加...
... | cut -d\| -f2-
...到管道的尾部。