提问人:sysadmincrispy 提问时间:9/6/2023 最后编辑:markp-fusosysadmincrispy 更新时间:9/14/2023 访问量:92
比较两个 csv 并将更新的行写入 linux bash 终端中的第三个 csv [已关闭]
Compare two csv and write updated rows to third csv in linux bash terminal [closed]
问:
我正在尝试比较与 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
这应该是预期的输出
答:
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
下一个:Linux中大型TSV的条件编辑
评论
-F
comm