とても似たような質問です。ファイルの行を繰り返す方法は?。
次の行を含むファイルがあります。Nスペースで区切られたフィールド。ファイルを1行ずつ繰り返して、フィールドを他のファイルの情報を呼び出すために使用できる変数に設定したいと思います。
たとえば、私のファイルは次のようになります。
A B C
D E F
H I J
K L M
各行を繰り返し、変数をフィールドに設定したいと思います。
foreach i ( `cat file ` )
set 1st = $i[1]; set 2nd = $i[2]; set 3rd = $i[3]
end
現在、私のシェルはスペースを使用してフィールドを区切っているため、各行に3つの変数を設定することはできません。
echo
それぞれを見ると、$i
次のような内容が表示されます。
A
B
C
D
....
新しい行だけを区切り文字として使用してループを制御する方法を知りたいです。
それが私が本当に達成したいものです。 3つの異なる値を含むファイルAの行をgrepしたいと思います。これらの値はすべて、ファイルBの1行にスペースで区切られた要素として表示されます。私の計画は、Bの対応する行にある各要素(スペースで区切られています)に対してファイルBの各行を繰り返し、その3つの要素を使用することです。次に、Bの次の行に対してこの操作を繰り返します。しかし、私のループはファイルBの行を見ることができないので失敗します。スペースで区切られたすべての要素のみが表示され、3つの要素の行にグループ化されていることを認識できません。これが混乱しないことを願っています。
答え1
元の質問が十分に明確に渡されたかどうかはわかりませんが、行にスペースで区切られた要素を含むシェル環境でテキストファイルの行を繰り返すのに問題があるようです。
row 1: A B C
row 2: D E F
各行を要素に変換して解決策を見つけ、後でこの質問の範囲外になるように解析できます。だから上記の2行は
row 1: A_B_C
row 2: D_E_F
この形式では、私のforeachループは各行を単一の要素として扱います。最初の反復でBが必要な場合は、次のように使用できます。
foreach i ( `cat <file>` )
foreach? set a = `echo $i | awk -F '_' '{print($2)}'`
foreach? echo $a
foreach? end
次の内容をエコーする必要があります。
B
E
これは私のファイルの各行の2番目の要素になります。
興味のある方に感謝し、よりエレガントな方法があるかどうかを教えてください。
答え2
誰かがこの質問に答えることができることを願っています。可能ですか?はい。おすすめ?いいえ。しかし、必ずしなければならない場合は、次のstackoverflowの答えに従ってください。
答え3
cshの単語分割機能は、Bourneシェルよりもほぼ優れています。 cshはワイルドカード操作なしで"`cmd`"
出力をcmd
空ではない行に分割しますが、`cmd`
ワイルドカード操作を介して空白、タブ、または改行に分割します。だからあなたはこれを行うことができます:
set n = 0 noglob
foreach line ( "`cat file`" )
@ n++
set field = ( $line )
echo First field of line $n is $field[1], second is $field[2]
end
もちろん、行とフィールドでテキストを処理するには、シェルループの代わりに、perl
または同様のものを使用できます。awk