我正在尝试获取具有多列的文件中的唯一行。
我的文件“file.txt”包含下面的示例记录
20230830,52678,004,Apple,21
20230830,52678,004,Apple,20
20230830,52678,004,Apple,19
20230831,47689,001,Orange,15
20230901,47620,002,Grape,29
我想要的输出是仅打印第 1 列到第 4 列中的唯一行。无论第 5 列上的值如何
20230831,47689,001,Orange,15
20230901,47620,002,Grape,29
我尝试使用 sed 在第 1-4 列和第 5 列之间添加唯一的分隔符
然后我使用 awk 命令从第 1-4 列获取唯一行
sed 's/,/|/4' file.txt | awk -F"|" '{arr[$1]++} END{for(i in arr) if(arr[i]==1) print $0}'
使用这段代码,它可以处理少量数据,但是当我在包含 1000 行的文件中使用时,我得到...
20230831,47689,001,Orange,15
20230831,47689,001,Orange,15
20230831,47689,001,Orange,15
20230831,47689,001,Orange,15
...
独特的价值观不断涌现。他们在复制。似乎我只得到了一条独特的线,而且它一直在重复。
如果我的代码有问题,你能帮我吗?
我期望只打印这样的独特线条
20230831,47689,001,Orange,15
20230901,47620,002,Grape,29
无需使用
sed
将字段分隔符从 转换,
为|
,因为awk
能够解析 上的文件,
。一个
awk
想法:这会生成:
注意:不保证数组索引的处理顺序;如果输出必须按特定顺序排序,我们可以添加更多代码
回复:OP的评论:
I just need to make it in one line.
我想到了几个选择:将当前代码塞入一行,例如:
将
awk
代码放入单独的文件中(例如key.awk
),然后在调用中引用该文件awk
,例如:awk 可以单独解决你的问题:
此 Unix 管道将根据前 4 个字段识别文件中重复的行:
然后,您可以使用
grep
反转匹配,以便跳过重复项:印刷:
这样做的优点是内存需求较低,因为您不必将整个文件保存在内存中。