在制表符分隔文件中的数据标题行中单击一个单词,并为每一行剪切#列

时间:2014-10-31 16:32:30

标签: bash csv grep

no      de      en      fr      sv
eple    apfel   apple   pomme   äpple
kake    Kuchen  cake    gâteau  tårta

每个以制表符分隔的字典文件中有20多种语言,并且它们是从文件到文件中随机排序的,因此我想找出批量提取所需列的解决方案。我想 grep所需的语言列,并删除我不需要的所有语言数据。

我想使用grep,cut或其他随时可用的Linux工具 - 任何事情都可以 只要它完成工作就可以了。

在我的特殊情况下,我现在想要检索" no"," en"和" sv"列。 所以,我希望我的输出文件最终看起来像:

no      en      sv
eple    apple   äpple
kake    cake    tårta

无论标题行顺序如何,相同的代码都应适用于数据,即它可以是" en fr sv de no"而不是上面的#34; no de en fr sv"或任何其他变化。

1 个答案:

答案 0 :(得分:2)

awk -v FS='\t' -v OFS='\t' -v langs='no en se' '
# Collect the appropriate column numbers from the first row.
NR==1 {
    for (i=1; i<=NF; i++) {
        if (match(langs, "\\<"$i"\\>")) {
            col[i]++
        }
    }
}

{
    # Walk the columns and if this column number is in our list of columns print the value out.
    for (i=1; i<=NF; i++) {
        if (i in col) {
            printf "%s%s", $i, OFS
        }
    }
    print ""
}' file

如果某些条目的运行时间长于8个字母,则其输出可能会关闭(按列方式),在这种情况下,到column -t -s $'\t'的管道可能会有帮助。