0

私は次のようなファイルを持っています

line1 word1 word2 word4 etc..
line2 word1 word2 word4 etc..

コマンドで単語を抽出できることはわかっていcut -d ' ' -fxますが、1回の操作で多くの単語を抽出して割り当てたいと思います。

while read line;do
  echo $line | awk '{ word1=$1; word2=$2 }'
  # usage $word1, $word2, etc.
done < $file 

これは可能ですか?

より良い例

ファイル
jose  1234 2011/12/01
maria 2345 2010/04/10
脚本
while read line;do
  echo $line | awk '{ name=$1; counter=$2, date=$3 }'
  # usage $name, $counter, $date, etc
done < $file 
4

2 に答える 2

6

1行の単語数が固定されている場合(簡単な場合)、次のようになります。

while read name number date
do
    # ...use $name, $number, $date
done <<'EOF'
jose  1234 2011/12/01
maria 2345 2010/04/10
EOF

行に4つ以上の単語がある場合$date、名前と番号の後に残っているすべての単語を取得することに注意してください。3つ未満の場合、readは機能しますが、値(dateまたはnumberまたはname)のない変数は空の文字列になります。

1行の単語数が可変の場合は、次のbash 配列を使用することをお勧めしreadます。

while read -a array
do
    # ...process "${array[@]}"...
    echo "${array[@]}"
done <<'EOF'
one
two three
four five six
seven eight
nine
EOF
于 2013-01-17T15:56:42.310 に答える
3

awkを使用して可能です

root@server$ vars=$( awk '{for(i=1;i<=NF;i++){ print "word" i "=" $i }}' file )
root@server$ echo $vars
word1=one word2=two word3=three
root@server$ declare $vars
root@server$ echo $word1 
one

だから内訳

Awkには、行のフィールド数である内部変数NFがあります。したがって、すべてのフィールドに対してクイックforループの反復を実行し、フィールド0をスキップして行全体を実行します。反復ごとに、bash変数割り当てステートメントを出力し、出力をvars変数にキャプチャします。

次に、declareを使用して変数を宣言します。宣言を使用しない場合は、ファイル内の任意のコードを実行しています。

これがお役に立てば幸いです。

于 2013-01-17T16:03:47.583 に答える