如何使用awk删除47字段csv文件第1~46列中的重复项?

如何使用awk删除47字段csv文件第1~46列中的重复项?

我有一个 bash 脚本可以将许多文件合并到一个 csv 文件中。该 csv 文件有 47 个字段和 10000 行。

然而,为了删除我使用的重复项awk '!seen[$0]++',为了排序,我在第 47 列中添加了对原始源的引用。

我仍然只想在第 1 列到第 46 列上建立索引并打印所有列(包括 47)。

我必须将所有 46 个都列出来awk '!seen[$1, $2, $3, ,..etc.., $45, $46]++,还是有更简单的方法?

答案1

'sort_field=$47; $47=""; !seen[$0]++ { print $0 " " sort_field }' 

答案2

使用和打印基于 1~46 字段sort的 uniqe 选项的唯一行?-uk1,46

sort -uk1,46 infile.txt

如果您的输入文件以 .csv 逗号分隔,则可以使用 .csv 进行指定-t','

sort -t',' -uk1,46 infile.txt

对于以下输入作为示例:

1,2,3,4
5,6,7,8
1,2,3,x
a,b,c,d
5,6,7,y

输出是:

1,2,3,4
5,6,7,8
a,b,c,d

答案3

尝试这个:

$ cat file
1 2 3 4
5 6 7 8
1 2 3 x
a b c d
5 6 7 y

将前 3 个字段视为“键”,我们要删除第二个“1 2 3”和第二个“5 6 7”行

awk '
    {
        line = $0     # remember the original state of this line
        NF--          # forget about the last field
    }
    !seen[$0]++ {print line}   # if the "new" line is unique, print the "old" line
' file
1 2 3 4
5 6 7 8
a b c d

相关内容