,
のスペースではなく、コンマfor foo in list
でテキストを分割したい。 CSVファイルCSV_File
に次のテキストが含まれているとします。
Hello,World,Questions,Answers,bash Shell,script
...
次のコードを使用して、いくつかの単語に分割しました。
for Word in $(cat CSV_File | sed -n 1'p' | tr ',' '\n')
do echo $Word
done
以下を印刷します:
Hello
World
Questions
Answers
bash
Shell
script
しかし、スペースではなくコンマでテキストを分割したい:
Hello
World
Questions
Answers
bash Shell
script
これをbashでどのように達成できますか?
サブシェル置換を使用して単語を解析すると、スペースをまとめるために行っているすべての作業が取り消されます。
代わりに試してください:
cat CSV_file | sed -n 1'p' | tr ',' '\n' | while read Word; do
echo $Word
done
また、並列性も向上します。質問のようにサブシェルを使用すると、回答の繰り返しを開始する前にサブシェルプロセス全体が強制的に終了します。 (私の答えのように)サブシェルにパイピングすると、それらが並行して動作します。もちろん、これはファイルに多くの行がある場合にのみ重要です。
[〜#〜] ifs [〜#〜] に設定:
sorin@sorin:~$ IFS=',' ;for i in `echo "Hello,World,Questions,Answers,bash Shell,script"`; do echo $i; done
Hello
World
Questions
Answers
bash Shell
script
sorin@sorin:~$
正規の方法は次のとおりです。
while IFS=, read field1 field2 field3 field4 field5 field6; do
do stuff
done < CSV.file
フィールドの数がわからない場合や気にしない場合:
IFS=,
while read line; do
# split into an array
field=( $line )
for Word in "${field[@]}"; do echo "$Word"; done
# or use the positional parameters
set -- $line
for Word in "$@"; do echo "$Word"; done
done < CSV.file
kent$ echo "Hello,World,Questions,Answers,bash Shell,script"|awk -F, '{for (i=1;i<=NF;i++)print $i}'
Hello
World
Questions
Answers
bash Shell
script
バッシュ関数を作成する
split_on_commas() {
local IFS=,
local Word_LIST=($1)
for Word in "${Word_LIST[@]}"; do
echo "$Word"
done
}
split_on_commas "this,is a,list" | while read item; do
# Custom logic goes here
echo Item: ${item}
done
...これにより、次の出力が生成されます。
Item: this
Item: is a
Item: list
(注、この回答はフィードバックに従って更新されています)
読む: http://linuxmanpages.com/man1/sh.1.php & http://www.gnu.org/s/hello/manual/autoconf/Special-Shell -Variables.html
IFS展開後のWord分割に使用され、read組み込みコマンドで行を単語に分割するために使用される内部フィールド区切り文字。デフォルト値は `` ''です。
IFSはシェル環境変数であるため、シェルスクリプトのコンテキスト内では変更されませんが、エクスポートしない限り、変更されません。また、IFSは環境からまったく継承されないことに注意してください。IFSの理由と詳細については、このgnu投稿を参照してください。
あなたはこのように書かれたコードです:
IFS=","
for Word in $(cat tmptest | sed -n 1'p' | tr ',' '\n'); do echo $Word; done;
動作するはずです。コマンドラインでテストしました。
sh-3.2#IFS=","
sh-3.2#for Word in $(cat tmptest | sed -n 1'p' | tr ',' '\n'); do echo $Word; done;
World
Questions
Answers
bash Shell
script
次を使用できます。
cat f.csv | sed 's/,/ /g' | awk '{print $1 " / " $4}'
または
echo "Hello,World,Questions,Answers,bash Shell,script" | sed 's/,/ /g' | awk '{print $1 " / " $4}'
これは、コンマをスペースに置き換える部分です
sed 's/,/ /g'