0

我有一个小问题,我会很感激帮助我解决这个问题。

总之,我有一个文件:

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),但是这两列会出现在彼此下方而不是彼此旁边。

我怎样才能让它们出现在彼此旁边?

4

3 回答 3

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
于 2013-01-15T14:03:06.203 回答
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

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

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

我希望现在更清楚了。

请等待您的意见。

谢谢艾哈迈德

于 2013-01-16T00:04:17.900 回答
-1

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

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

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

于 2013-01-15T11:56:26.403 回答