我有一个制表符分隔的文件,我想在其中扫描标题(第一行)以查找包含关键字的列。然后,我只想打印文件其余部分中的那些列。
从这个示例文件:
sample AAA BBB sample_CCC DDD EEE sample_FFF
000 aaa bbb ccc ddd eee fff
我希望得到这样的东西:
sample sample_CCC sample_FFF
000 ccc fff
我努力了:
awk -F"\t" '{for(i=1;i<=NF;i++){if ($i ~ /sample/){print $i}}}' filename > outputfile
但是,这只会提取具有该确切字符串(样本)的列,而不是包含该字符串的列(sample_CCC、sample_FFF)。
有没有办法更改此代码,以便它提取与字符串不完全匹配但包含该字符串的列?
答案1
perl 提供了一个简洁的解决方案:
perl -ale '
@cols = grep {$F[$_] =~ /sample/} 0..$#F if $. == 1;
print "@F[@cols]";
' file
答案2
像这样的事情怎么办?
NR==1 {
for (i=1; i<=NF; i++) {
if ($i ~ /sample/) {
head[i]= $i
printf "%s\t", $i
}
}
printf "\n"
}
NR>1 {
for (i=1; i<=NF; i++) {
if (head[i]) {
printf "%s\t", $i
}
}
printf "\n"
}
这是一种有点幼稚的方法,但它适用于小文件。
答案3
$ awk '
BEGIN { FS=OFS="\t" }
NR==1 {
for (inFldNr=1; inFldNr<=NF; inFldNr++) {
if ($inFldNr ~ /sample/) {
out2inFldNr[++numOutFlds] = inFldNr
}
}
}
{
for (outFldNr=1; outFldNr<=numOutFlds; outFldNr++) {
inFldNr = out2inFldNr[outFldNr]
printf "%s%s", $inFldNr, (outFldNr<numOutFlds ? OFS : ORS)
}
}
' file
sample sample_CCC sample_FFF
000 ccc fff