2017-10-24 5 views
1

私はドックに置いておきたいさまざまなアイコンの場所をどこに置いたCSVを読み込むスクリプトを作成しています。なぜawkを使うのがうまく動作するのですか?awkコマンドに変数を代入すると、その中に空白があるものはすべて破損しますか?

/Applications/Launchpad 
/Applications/Safari 
/Applications/Pages 
/Applications/Numbers 
/Applications/Keynote 
/Applications/Photos 
/Applications/iMovie 
/Applications/GarageBand 
/Applications/Microsoft\ Word 
/Applications/Microsoft\ Excel 
/Applications/Microsoft\ Powerpoint 

をしかし、私は変数にこれを同じコマンドを割り当てて、

for i in $this; do 
    echo $i; 

を実行した場合、最後の3行は次のように印刷::私は

awk -F "," '{print $1} test.csv 

を実行する場合、私はなります

/Applications/Microsoft\ 
Word 
/Applications/Microsoft\ 
Excel 
/Applications/Microsoft\ 
Powerpoint 

私は明らかにスペースを壊して修正する必要がありますが、なぜそれが1つではなく他のものでは機能しないのか分かりません。デフォルトでは強いテキスト

+0

http://mywiki.wooledge.org/DontReadLinesWithFor –

+0

'awk'コマンドが一致しない単一引用符を持っています。使用している実際のコマンドをコピーして質問に貼り付けてください。 –

答えて

2

、すべての空白のループ分割のためのバッシュは、あなたは、ループの前IFS=$'\n'を設定することにより、

テスト結果、それを上書きすることができます。

[email protected]:/tmp$ cat testfile 
/Applications/Launchpad 
/Applications/Safari 
/Applications/Pages 
/Applications/Numbers 
/Applications/Keynote 
/Applications/Photos 
/Applications/iMovie 
/Applications/GarageBand 
/Applications/Microsoft\ Word 
/Applications/Microsoft\ Excel 
/Applications/Microsoft\ Powerpoint 

をawkをを使用して、結果を格納言います

[email protected]:/tmp$ testvar=$(awk '1' testfile) 

以下のデフォルトの動作

のようなものデフォルトでは、タブ、改行です Internal Field Separator ($IFS)変数内の文字のいずれかによって展開され、その後、分割され

for i in $this; do 
    echo $i; 

$this

[email protected]:/tmp$ for i in $testvar; do echo "$i"; done 
/Applications/Launchpad 
/Applications/Safari 
/Applications/Pages 
/Applications/Numbers 
/Applications/Keynote 
/Applications/Photos 
/Applications/iMovie 
/Applications/GarageBand 
/Applications/Microsoft\ 
Word 
/Applications/Microsoft\ 
Excel 
/Applications/Microsoft\ 
Powerpoint 

このはあなたのコードでIFS

[email protected]:/tmp$ IFS=$'\n';for i in $testvar; do echo "$i"; done; 
/Applications/Launchpad 
/Applications/Safari 
/Applications/Pages 
/Applications/Numbers 
/Applications/Keynote 
/Applications/Photos 
/Applications/iMovie 
/Applications/GarageBand 
/Applications/Microsoft\ Word 
/Applications/Microsoft\ Excel 
/Applications/Microsoft\ Powerpoint 
+0

IFSを設定していませんか?それは改行に設定されたままにしておくよりも悪いようです。 –

+1

@WillBarnwellありがとうございました。あなたは正しいです、 'IFS = $ OldIFS'や' IFS = $ '\ t \ n''のようなものを使用している可能性があります。 –

+1

遅れていたが、これは私にとってはうまくいった。ありがとうございました –

0

でありますとスペース。あなたは私たちが使用して改行にIFSを設定するので、我々は唯一の改行の文字列分割を希望したい動作を取得するには、次のIFSで遊ん

IFS=$'\n' 

は、その別の変数に元IFSの値を保持することをお勧めします、慎重に行われるべきです変更されたIFSを使用した後で復元します。

かで元に戻す:一緒だから、すべての

IFS=$' \t\n' 

IFS=$'\n' 
for i in $this; do 
    echo $i; 
IFS=$' \t\n' 

万一出力をあなたが欲しいもの。

回答するにはなぜこのようになります。 awk出力はグロビングまたは分割の対象にはならず、変数の展開された内容は次のとおりです。

0

どちらか

awk -F "," '{print $1} test.csv | while IFS= read -r line; do 
    do_stuff_with "$line" 
done 

または完全

while IFS=, read -r first restOfList; do 
    do_stuff_with "$first" 
done < test.csv 

リソースのawkをスキップ行います

関連する問題