我有一个无标题的 CSV 文件,按第一列排序。当第二列和第三列相同时,我想将它们“折叠”为一列 - 即让最后一列留空。换句话说,这是:
0000001,11111,66666
0000002,12121,22222
0000003,33333,33333
0000004,74747,44444
0000005,12345,12345
...变成这样:
0000001,11111,66666
0000002,12121,22222
0000003,33333,
0000004,74747,44444
0000005,12345,
我尝试过各种排列组合grep
和cut
,但都无法奏效——我最接近的是cut -c 8-19 file.csv
,它只是隔离了第 2 列和第 3 列。我觉得需要跨列执行此操作,并且需要删除值而不是整行,这使得它足够复杂,需要awk
或sed
,而我对这两者都不太了解,不知道如何处理它。
这
awk
(对于任何发行版)都应该适合你:在 GNU 中,
awk
请使用您显示的示例尝试以下代码。使用match
正则表达式函数(^[^,]+,)([^,]+)(,)([^,]+)(.*$)
,并利用其将匹配值保存到捕获组中的功能,以便以后根据需要进行检查和打印。使用
sed
这可能对你有用(GNU sed):
模式匹配第二列和第三列并用第二列替换。
我将利用 GNU
AWK
完成以下任务,让file.txt
内容然后
给出输出
解释:我告诉 GNU,
AWK
逗号既是字段分隔符(FS
),又是输出字段分隔符(OFS
),然后我使用所谓的三元运算符组成一行,条件是第二个字段等于第三个字段,如果为真,则值为空字符串,如果为假,则值为第三个字段内容。(在 GNU Awk 5.0.1 中测试)