0

シェルスクリプトに入れる前に、シェルでシェル行をチェックしています

$ cat file.csv | awk -F',' '{ print $2 }' 
"test1 test2 test1"
"test2 test3 test100"
"test3 test4 test3"

一方、スクリプトでは、上記のすべての情報を次のように配列に入力しています

arr=(`cat file.csv | awk -F',' '{ print $2 }'`)
for v in ${arr[@]}
do
    echo $v
done

こんな私に響く

"test1
test2
test1"
"test2 
test3 
test100"
"test3 
test4 
test3"

たとえば、次のようなエントリのように、配列にデータを入力する必要があります。

"test1 test2 test1"

そしてそうではない

"test1
test2
test1"
4

2 に答える 2

3

ここでの問題は、bash が配列の各要素を区切るものを決定する方法です。デフォルトでは、IFS vairable 内の任意の文字を使用します。デフォルトは空白、つまりタブ スペースと改行です。配列の各要素には空白が含まれているため、適切に機能させたい場合は、これを IFS の一部にすることはできません。したがって、試してみると:

root@host$ cat x.txt
blah,one two three,blah
blah,four five six, blah
root@server$ IFS=$'\n' arr=( $(  awk -F',' '{print $2 }' x.txt ) ) ## no need to cat into awk it can take a filename argument to read from
root@server$ for v in ${arr[@]};do echo "$v";done
one two three
four five six

正しく出力されるはずです

于 2013-01-29T10:27:14.220 に答える
0

問題は、配列がどのように埋められるかです。元の質問では、配列への割り当てによって無視される csv で引用符で囲まれた値を使用しています。

arr の代入では、$( ) ビットが二重引用符で囲まれていることに注意してください。

file.csv="test1 test2 test1","test2 test3 test100","test3 test4 test3"

$ arr=( "$( awk -F, 'print $2}' file.csv)" )

配列に値を正しく入れます。

$ for f in ${arr[@]}; do echo $f; done

2番目の値を出力します:

"test2 test3 test100"

2 番目の値の引用符は、echo $f または echo "$f" のどちらを使用しても問題ありません。

于 2013-01-29T11:16:46.300 に答える