0

特定の数のフィールドに分割された行で構成される入力ストリームがあるとします。さまざまなフィールドをカットし、特定のフィールド (またはフィールド) をプログラム (入力行ごとに 1 行を返すと想定) にパイプし、他のフィールドをそのままにして、結果を貼り付けたいと思います。おそらく複雑な解決策を想像することはできますが、それを行うためのクリーンで自然な方法があるはずです。

具体的な例として、次の形式の行を生成するプログラムがあるとします。

$ inputprog
<a> hello world!
<b> hi everyone!
<a> hi!

最初のフィールドを変更せずにメッセージを大文字にしたいとします。これが私が物事を想像する方法です:

$ inputprog | program -d' ' -f2- "tr a-z A-Z"
<a> HELLO WORLD!
<b> HI EVERYONE!
<a> HI!

を近似するための合理的にクリーンな方法を探していますprogram。(この例に固有のソリューションには興味がありません。)

よろしくお願いします。

4

1 に答える 1

1

awkあなたがしたいことをすることができます。例えば:

$ echo "field1 field2" | awk '{$2 = toupper($2); print;}'
field1 FIELD2

やりたいことにかなり近づきます。$2 = toupper($2);2 番目のフィールドを変更printし、(変更された) 行全体を出力します。

ただし、「フィールド」の定義方法に問題があります。上記の例では、フィールドはスペースで区切られています (フィールドセパレーターを次のように任意の正規表現に変更できます: -F'<[a-zA-Z]+>'- これはフィールドセパレーターと見なされます)。しかし、あなたの例では、<a>あるフィールドとhello world!別のフィールドとして表示しているようです。どのプログラムも、そのように大雑把に推測することによってのみ、目的の動作に到達できます。world!3 番目のフィールドと見なされないのはなぜですか? したがって、フィールドを分離するという明確なポリシーで入力を得ることができれば、それawkはまさにあなたが望むものです.

http://people.cs.uu.nl/piet/docs/nawk/nawk_92.html (awk 文字列関数) やhttp://www.pement.org/awk/awk1line.txt (awk 1 ライナー) などのページを確認してください。 ) 詳細については。

ところで、最初のフィールドを除くすべてのフィールドをループすることで、上記の特定の例を機能させることもできます (NF == フィールドの数):

$ echo "<a> hello world!
<b> hi everyone!
<a> hi" |  
awk '{for(i=2;i<=NF;++i) { $i=toupper($i); }; print;}'
<a> HELLO WORLD!
<b> HI EVERYONE!
<a> HI

この例の解決策には興味がありませんが。;-)

PS:sed仕事もできるはずです (http://en.wikipedia.org/wiki/Sed)

于 2011-07-28T08:41:27.903 に答える