web-dev-qa-db-ja.com

スペースではなくコンマでリストを分割する方法

,のスペースではなく、コンマ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でどのように達成できますか?

42
Eng.Fouad

サブシェル置換を使用して単語を解析すると、スペースをまとめるために行っているすべての作業が取り消されます。

代わりに試してください:

cat CSV_file | sed -n 1'p' | tr ',' '\n' | while read Word; do
    echo $Word
done

また、並列性も向上します。質問のようにサブシェルを使用すると、回答の繰り返しを開始する前にサブシェルプロセス全体が強制的に終了します。 (私の答えのように)サブシェルにパイピングすると、それらが並行して動作します。もちろん、これはファイルに多くの行がある場合にのみ重要です。

45
mkj

[〜#〜] 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:~$ 
48
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
17
glenn jackman
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
10
Kent

バッシュ関数を作成する

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

(注、この回答はフィードバックに従って更新されています)

7

読む: http://linuxmanpages.com/man1/sh.1.phphttp://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
5
Ashley Raiteri

次を使用できます。

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'
0
ozma