我有一个 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 选项的唯一行?-u
k1,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