2016-06-27 8 views
2

awkを使用してレコードを行ごとに解析し(max要素までループします(NFまで)、bash変数にいくつかのフィールドを保存します。私は必要なレコードを手に入れることができましたが、回避することはできませんawk stdoutへの出力は です。awkに標準出力への出力を抑制する必要があります

これは私が採用した例です。

newvar=$(echo "Hello, this is a sentence with a few words." | awk '{ s = ""; for (i = 0; i <= 5; i++) s = s $i " "; print s }' 

私はbashの変数newvarの単語Hello, this is a sentenceを保存したかったです。これを行うより効率的な方法がありますが、現時点ではawkとのやり方を検討してください。

これは

$ newvar=$(echo "Hello, this is a sentence with a few words." | awk '{ s = ""; for (i = 0; i <= 5; i++) s = s $i " "; print s }' 1>&-) 

が言って醜いエラーを得た、と私は1>&-をすることによってnullstdoutを抑制しようとした変数

Hello, this is a sentence with a few words. Hello, this is a sentence 

で下図のように出力を記憶しています

awk:(FILENAME = - FNR = 1)警告:stの書き込み中にエラーが発生するandard出力(不正なファイル記述子)

ここでまともな回答を見つけることができませんでした。これはawkでも可能ですか?正確な投稿の重複が見つかった場合は、それも評価されます!

+0

はなぜ誤りを訂正するのではなく、エラーメッセージを抑制しない:

これはあなただけで最初の5つのワードを印刷したい場合は、cutを使用し、言われていますか? – Kusalananda

+2

行の最後に閉じ括弧を追加すると、うまく動作しているように見えます。マッチした行の単語が0であるため、1と5の間でループすると想像します。 – patthoyts

+0

@Kusalananda:あなたが何を意味するか分かりません! – Inian

答えて

4

ここでの問題は、0から5へのループです。つまり、変数s$0を格納していて、わかっているようにフルレコードが含まれています。つまり、最初の5つのフィールドのあとにフルレコードを格納しています。

1から5までだからループ:

$ awk '{s = ""; for (i = 1; i <= 5; i++) s = s $i " "; print s }' <<< "Hello, this is a sentence with a few words." 
Hello, this is a sentence 

注初めに""としてsを設定する必要はありませんような方法によって:あなたはそれを使用して起動時に任意の変数が設定されますありません。複数の行があるため、レコードごとに値をリセットする必要があるため、これを使用している可能性があります。

$ cut -d' ' -f-5 <<< "Hello, this is a sentence with a few words."Hello, this is a sentence 
+1

これは本当に基本的なものでした!それを受け入れる!それ以上の効率的な答えは適用できません! – Inian

関連する問題