比较两个 csv 并将更新的行写入 linux bash 终端中的第三个 csv [已关闭]

Compare two csv and write updated rows to third csv in linux bash terminal [closed]

提问人:sysadmincrispy 提问时间:9/6/2023 最后编辑:markp-fusosysadmincrispy 更新时间:9/14/2023 访问量:92

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

3个月前关闭。

我正在尝试比较与 linux bash 终端不同的两个 csv 和 generete only 行 并将其输出到 bash 终端中的第三个 CSV

grep -v -f csv1 csv2 > csv3

但是我无法获得与 csv1 和 csv2 不同的行,而是打印 csv2 中的所有行

csv1的 a,b,c 克,FC

csv2的 a,b,c g,f,c 左,右,C

csv3的 左,右,C

这应该是预期的输出

linux bash csv grep

评论

1赞 user1934428 9/6/2023
至少,您还应该使用 ,以避免 csv1 的行被解释为正则表达式。-F
0赞 sysadmincrispy 9/6/2023
@user1934428尝试过这个也不适用于 -F
1赞 user1934428 9/6/2023
对我有用。请看这里。难道你在 csv1 中有一个空行吗?也许在最后?更新您的问题,为您的问题显示一个简单的可重现示例。
1赞 glenn jackman 9/6/2023
这听起来像是一份工作comm
1赞 dawg 9/6/2023
请从这些输入中添加示例输入和所需的输出。

答:

1赞 Azury 9/6/2023 #1

试试这个看看它是否有效(确保安装 panda):

python -c "import pandas as pd; df1 = pd.read_csv('csv1.csv'); df2 = pd.read_csv('csv2.csv'); df_diff = pd.concat([df1, df2]).drop_duplicates(keep=False); df_diff.to_csv('csv3.csv', index=False)"```

评论

0赞 sysadmincrispy 9/6/2023
它正在工作,但我不需要对值进行排序。我想要它原样
0赞 sysadmincrispy 9/6/2023
是否可以以相同的顺序获得结果
1赞 markp-fuso 9/6/2023 #2

示例文件:

$ head csv?
==> csv1 <==
1,2,X
4,5,6
7,8,9

==> csv2 <==
1,2,3
a,b,c
7,8,9

一个想法:comm / sort

$ comm --output-delimiter="" -3 <(sort csv1) <(sort csv2)
1,2,3
1,2,X
4,5,6
a,b,c

评论

0赞 sysadmincrispy 9/6/2023
@mark-扶桑,我只需要 CSV 中的行,这些行在比较两者时是唯一的
1赞 markp-fuso 9/6/2023
@sysadmincrispy(对我来说)不清楚你所说的只有有差异的行是什么意思,只需要 csv 中唯一的行;如果您使用一些示例文件(每个文件 3-4 行,每行 3-4 个字段)更新问题,这将有所帮助
1赞 markp-fuso 9/6/2023
@sysadmincrispy给定我提供的两个示例文件,您期望的结果是什么?
0赞 dawg 9/6/2023 #3

鉴于:

head file{1,2}

==> file1 <==
1,2,3
4,5,6
7,8,9

==> file2 <==
1,2,3
a,b,c
7,8,9

您可以使用此 awk 查看哪些 file2 行不在 file1 中:

awk 'FNR==NR{f1[$0]; next}
!($0 in f1)' file1 file2

指纹:

a,b,c

如果您希望从 file2 到 file1 的差异,请反转两个文件输入:

awk 'FNR==NR{f1[$0]; next}
!($0 in f1)' file2 file1

指纹:

4,5,6

或者你可以使用 daff 来获得更完整的解决方案。

评论

0赞 sysadmincrispy 9/6/2023
当我替换我的 csv 时,如果我将 file1 放在第二个,它将显示所有内容,如果它将文件 2 放在该命令中,它会显示文件 2 中的所有内容,grep -v -f 也会发生同样的情况
0赞 aborruso 9/7/2023 #4

如果您有 file1.csv

a,b,c
g,f,c

和文件2.csv

a,b,c
g,f,c
l,f,c

你可以运行

grep -v -F -f file1.csv file2.csv 

获取

l,f,c