我想从一个巨大的文件(约100万)中删除多个重复列。 我想要删除的列具有相同的列名称:A和其他人具有不同的唯一名称。说:删除unix中的重复列
甲B2甲B3
1.1 AA 1.2 AA
2.1 AB 4.3 CT
2.2 AC 6.4 GT
所以列标题是A,B2,A,B3, ......。 如何从数据中删除名为A的列。
我想从一个巨大的文件(约100万)中删除多个重复列。 我想要删除的列具有相同的列名称:A和其他人具有不同的唯一名称。说:删除unix中的重复列
甲B2甲B3
1.1 AA 1.2 AA
2.1 AB 4.3 CT
2.2 AC 6.4 GT
所以列标题是A,B2,A,B3, ......。 如何从数据中删除名为A的列。
另在AWK:
$ awk '
NR==1 {
split($0,a)
for(i in a)
if(a[i]=="A")
delete a[i]
}
{
for(i=1;i<=NF;i++)
printf "%s",(i in a?$i OFS:"")
printf ORS
}' file
B2 B3
AA AA
AB CT
AC GT
}'此处的文件'应该被删除:其他方面完全没问题! –
这个伟大的awk命令解决了这个问题。在我运行代码之前:我在第一行添加了#!/ usr/bin/awk -f –
我不知道我在正确理解你的问题,但在这里的(GNU)awk
解决方案删除所有重复列(只保留第一次出现):
#!/usr/bin/awk -f
NR==1 {
seen[$1] = 1
cols[0] = 1
for (i=2; i<=NF; i++) {
if (!($i in seen)) {
seen[$i] = 1
cols[length(cols)] = i
}
}
}
{
for (i=0; i<length(cols); i++)
printf $(cols[i]) " "
printf "\n"
}
对于第一线( (NR==1
),我们发现所有非重复列(保留顺序),对于所有其他行,我们只是打印出我们之前选择的列(字段)(cols
数组包含我们希望保留的列/字段索引)。
$ ./filter.awk file
A B2 B3
1.1 AA AA
2.1 AB CT
2.2 AC GT
cut -d' ' -f $(head -1 filename|tr ' ' '\n'|awk '{if(!seen[$0]++) print NR}'|paste -s -d ',') filename
这将工作就像一个魅力。
这个问题是由詹姆斯布朗代码解决的。
我加
到他的代码,正确的微小的错字第一行的代码的末尾(只需额外-'-删除)。
我很抱歉,我没有时间去尝试所有其他建议
与我最好的祝愿
显示你的努力 – RomanPerekhrest
如果它是一个巨大的文件,最简单的方法是看第一行(例如'sed -n'1p'或'head -n 1',通过眼睛识别坏列(在你的例子1和3中),然后使用'cut'来检索其他的(例如'cut -d''-f 2,4') – Beta
所以,你要清楚,你是否要删除重复的列**(所有重复出现的列名),或**删除具有特定名称的列**? – randomir