awk从文件中读取特定列

时间:2013-01-15 11:51:36

标签: awk

我有一个小问题,我很乐意帮助我。

总之,我有一个文件:

1,5,6,7,8,9

2,3,8,5,35,3

2,46,76,98,9

我需要从中读取特定行并将其打印到另一个文本文档中。我知道我可以使用(awk '{print "$2" "$3"}')打印彼此相邻的第二列和第三列。但是,我需要使用两个语句(awk '{print "$2"}' >> file.text)然后(awk '{print "$3"}' >> file.text),但这两个列会出现在彼此之下,而不是彼此相邻。

如何让它们彼此相邻?

3 个答案:

答案 0 :(得分:3)

如果必须在单独的进程中提取列,请使用paste将它们拼接在一起。我假设你的shell是bash / zsh / ksh,我假设你的样本输入中的空白行不应该在那里。

paste -d, <(awk -F, '{print $2}' file) <(awk -F, '{print $3}' file)

产生

5,6
3,8
46,76

没有流程替换:

awk -F, '{print $2}' file > tmp1
awk -F, '{print $3}' file > tmp2
paste -d, tmp1 tmp2 > output

根据您的回答更新:

首次出现时,这是一个令人困惑的设置。这有用吗?

for (( x=1; x<=$number_of_features; x++ )); do
    feature_number=$(sed -n "$x {p;q}" feature.txt)
    if [[ -f out.txt ]]; then
        cut -d, -f$feature_number file.txt > out.txt
    else
        paste -d, out.txt <(cut -d, -f$feature_number file.txt) > tmp &&
        mv tmp out.txt
    fi
done

必须多次读取file.txt文件。只需阅读一次就显得更有效率了:

awk -F, -f numfeat=$number_of_features '
    # read the feature file into an array
    NR==FNR {
        colno[++i] = $0
        next
    }

    # now, process the file.txt and emit the desired columns
    {
        sep = ""
        for (i=1; i<=numfeat; i++) {
            printf "%s%s", sep, $(colno[i])
            sep = FS
        }
        print ""
    }
' feature.txt file.txt > out.txt

答案 1 :(得分:0)

感谢所有人为答案做出贡献。我相信我的问题应该更清楚,对不起。

我的代码如下:

for (( x = 1; x <= $number_of_features ; x++ )) # the number extracted from a text file
do
    feature_number=$(awk 'FNR == "'$x'" {print}' feature.txt)
    awk -F, '{print $"'$feature_number'"}' file.txt >> out.txt
done

基本上,我从文本文档中提取要素编号(与列编号相同),然后打印该列。文本文档可能包含许多功能编号。

事情是,每次我有不同的功能号码(反映列号)。因此,应用上述解决方案不足以解决这个问题。

我希望现在更清楚了。

请等待你的意见。

由于 艾哈迈德

答案 2 :(得分:-1)

而不是使用awks文件重定向,使用shell重定向,例如

awk '{print $2,$3}' >> file

逗号将替换为输出字段分隔符的值(默认为空格)。