0

私は小さな問題を抱えており、私を助けていただければ幸いです。

要約すると、次のファイルがあります。

1,5,6,7,8,9

2,3,8,5,35,3

2,46,76,98,9

そこから特定の行を読み取り、それらを別のテキスト ドキュメントに出力する必要があります。awk '{print "$2" "$3"}'( ) を使用して、2 列目と 3 列目を並べて印刷できることはわかっています。awk '{print "$2"}' >> file.textただし、( ) と ( )のように 2 つのステートメントを使用する必要がありawk '{print "$3"}' >> file.textますが、2 つの列は隣同士ではなく下に表示されます。

それらを並べて表示するにはどうすればよいですか?

4

3 に答える 3

3

別々のプロセスで列を抽出する必要がある場合は、を使用pasteして列をつなぎ合わせます。私はあなたのシェルが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 ファイル リダイレクトを使用する代わりに、シェル リダイレクトを使用します。

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

カンマは、出力フィールド区切り文字 (デフォルトではスペース) の値に置き換えられます。

于 2013-01-15T11:56:26.403 に答える