删除 unix 中的重复列
deleting repetitive columns in unix
我想从一个巨大的文件(大约 100 万)中删除多个重复的列。
我要删除的列具有相同的列名:A 和其他列具有不同的唯一名称。说:
A B2 A B3
1.1 AA 1.2 AA
2.1 AB 4.3 CT
2.2 AC 6.4 GT
所以第 headers 列是 A、B2、A、B3、...。
如何从数据中删除名为 A 的列。
我不确定我是否正确理解了你的问题,但这里有一个 (GNU) awk
解决方案来删除所有重复的列(只保留第一次出现的列):
#!/usr/bin/awk -f
NR==1 {
seen[] = 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
数组包含 column/field 个我们希望保留的索引)。
$ ./filter.awk file
A B2 B3
1.1 AA AA
2.1 AB CT
2.2 AC GT
awk 中的另一个:
$ awk '
NR==1 {
split([=10=],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
cut -d' ' -f $(head -1 filename|tr ' ' '\n'|awk '{if(!seen[[=10=]]++) print NR}'|paste -s -d ',') filename
这会很有用。
James Brown 代码解决了这个问题。
我加了
!/usr/bin/awk -f
到他的代码的第一行并更正代码末尾的小拼写错误(只需添加 -'- 删除)。
抱歉,我没有时间尝试所有其他建议
送上我最美好的祝福
我想从一个巨大的文件(大约 100 万)中删除多个重复的列。 我要删除的列具有相同的列名:A 和其他列具有不同的唯一名称。说:
A B2 A B3
1.1 AA 1.2 AA
2.1 AB 4.3 CT
2.2 AC 6.4 GT
所以第 headers 列是 A、B2、A、B3、...。 如何从数据中删除名为 A 的列。
我不确定我是否正确理解了你的问题,但这里有一个 (GNU) awk
解决方案来删除所有重复的列(只保留第一次出现的列):
#!/usr/bin/awk -f
NR==1 {
seen[] = 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
数组包含 column/field 个我们希望保留的索引)。
$ ./filter.awk file
A B2 B3
1.1 AA AA
2.1 AB CT
2.2 AC GT
awk 中的另一个:
$ awk '
NR==1 {
split([=10=],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
cut -d' ' -f $(head -1 filename|tr ' ' '\n'|awk '{if(!seen[[=10=]]++) print NR}'|paste -s -d ',') filename
这会很有用。
James Brown 代码解决了这个问题。
我加了
!/usr/bin/awk -f
到他的代码的第一行并更正代码末尾的小拼写错误(只需添加 -'- 删除)。
抱歉,我没有时间尝试所有其他建议
送上我最美好的祝福