Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将两个文件与第一列进行比较,并在shell脚本中从第二个文件中删除重复的行_Shell_Unix - Fatal编程技术网

将两个文件与第一列进行比较,并在shell脚本中从第二个文件中删除重复的行

将两个文件与第一列进行比较,并在shell脚本中从第二个文件中删除重复的行,shell,unix,Shell,Unix,我将用一个例子来提问。我有两个文件: 文件#1 文件#2 期望输出: 002948998 752986QAK NTR974VTS 0000000 102948932 752986QSC NTR974VTS 0000000 102948933 752986QSC NTR974VTS 0000000 002901998 752986KFK NTR974MTS 0990000 注意:行之间没有间隙(enter) 我想使用文件1和文件2的第一列比较它们,如果它们在文件1中匹配,

我将用一个例子来提问。我有两个文件:

文件#1

文件#2

期望输出:

002948998 752986QAK NTR974VTS 0000000    
102948932 752986QSC NTR974VTS 0000000    
102948933 752986QSC NTR974VTS 0000000    
002901998 752986KFK NTR974MTS 0990000
注意:行之间没有间隙(enter)

我想使用文件1和文件2的第一列比较它们,如果它们在文件1中匹配,则从文件2中删除整行。我还想将结果保存到第1个文件或新文件,即文件#3,其中包含文件1和文件2的所有条目(不包含文件2的副本)。请在shell脚本中建议一个好的解决方案

目前我正在使用:

awk 'FNR==NR{a[$1];next};!($1 in a)' file1 file2 > file3
file3 >> file1

这不是你想要的吗

cat file1 file2 | sort -u > file3 
这将对输出进行排序,这可能不是您想要的,但将
-u
(“唯一”)标志传递到
排序将导致它删除所有重复的行

如果复制仅在第一列中,则可以添加字段说明符:

cat file1 file2 | sort -u -k1,1 > file3
如果你有空行,你可以用很多方法来摆脱它。整件事情通过<代码> GRP.<代码>或,如果空行有空格,<代码> GRP'[^ ] < /> >等

< p>可以使用这个AWK:

awk 'FNR==NR {a[$1];print;next} !($1 in a)' f1 f2 > file3

cat file3
002948998 752986QAK NTR974VTS 0000000
102948932 752986QSC NTR974VTS 0000000
102948933 752986QSC NTR974VTS 0000000
002901998 752986KFK NTR974MTS 0990000
说明:

FNR==NR    - Execute next block for 1st file only
a[$1]      - Create an associative array with key as `$1` (first field)
print      - prints entire row from 1st file
next       - move to next row
!($1 in a) - Execute this block for 2nd file, it means print all rows from 2nd file when
             `$1` is not in array `a`

模拟@Mark Reed的答案,但不进行排序,您可以使用
uniq
,如下所示:

cat file1 file2 | uniq --check-chars=9 > file3
它将concat启用文件1和文件2,并将此连接赋予
uniq
命令。此命令保留其输入的唯一行(通过仅保留第一次出现来删除重复项)。然后,输出存储在文件3中。
--check chars=9
只检查每行的前9个字符是否重复。您可以在中找到更多选项

如果第一列不是固定长度(9),则可以使用:

cat file1 file2 | uniq > file3

但是,这样的比较将不仅基于第一列(如您所需),而是基于整行

这不会给出OP的预期输出,因为输出将被排序。请您解释一下代码。谢谢。这是在新文件的开头添加一个回车符。我对输出排序没有问题。但我不希望我的文件以空行开头(回车)。数据从第二行开始。这会将结果保存到文件中吗?如果是的话,请你解释一下。对不起,有问题。我是shell脚本的新手。是的,我添加了
>file3
,以便将输出保存到文件中。添加解释。不,没有。即使第一列相同,第二列不同,也会添加行。整排人都在比较。我只想比较一下第1栏。如果这里提供的答案之一解决了你的问题,那么你应该把它标记为接受。
cat file1 file2 | uniq --check-chars=9 > file3
cat file1 file2 | uniq > file3