csvの各文字列を複数行に分割する方法

csvの各文字列を複数行に分割する方法

csv行の各文字列を分離したいと思います。

線の例(他の線、同じ概念である可能性があります)

machine23,machine094,machine73,machine83

それではこれを試してみましょう

echo machine23,machine094,machine73,machine83 |awk -F"," '{for(i=1;i<=NF;i++){printf "%-20s", $i};printf "\n"}'

しかし、我々は得る

machine23   machine094  machine7  machine83 

代わりに、次のような予想結果を取得します。

machine23
machine094 
machine7 
machine83 

どんな提案がありますか?

答え1

$ echo machine23,machine094,machine73,machine83 | tr ',' '\n'
machine23
machine094
machine73
machine83

または、実際にこれをawkで実行したい場合(おそらくawkでさらに処理したいからです):

$ echo machine23,machine094,machine73,machine83 | \
  awk -F',' -v OFS='\n' '{$1=$1;$0=$0;print}'
machine23
machine094
machine73
machine83

これはきちんとしたawkトリックを使用します。フィールドを変更した後( のようにフィールドがそれと同じに設定されている場合でも$1=$) set すると、$0=$0awk は入力行全体の書式を再指定します。元のフィールド区切り文字(FSこの場合はカンマ)を次のように置き換えます。出力フィールド区切り記号(OFSこの場合は改行文字)。

答え2

まず、教育の精神として、以下は、独自のロジックをあらかじめ用意されたバージョンにまとめたものです(読みやすくするために梱包して間隔をあけています)。

$ echo machine23,machine094,machine73,machine83 \
    |awk -F"," '{ for (i = 1; i <= NF; i++) { printf "%-20s\n", $i } }'
machine23           
machine094          
machine73           
machine83           

使用してから末尾の空白が追加されますが%-20s(上記の出力を選択して確認)、私がしたことはprintf "\n"ループ内に移動しただけです。printffor

あなたのバージョンには空白がほとんどないので、ここに暗号通貨ゴルフ論理ソリューションを使用してください。

echo machine23,machine094,machine73,machine83|awk -F, '{while(i<NF)print$++i}'

 

以下は、ループなしでグローバル置換を使用するフィールドに依存しないawkソリューションです。

$ echo machine23,machine094,machine73,machine83 |awk '{ gsub(/,/,"\n"); print }'
machine23
machine094
machine73
machine83

これは次のsedソリューションを模倣します。

$ echo machine23,machine094,machine73,machine83 |sed 's/,/\n/g'
machine23
machine094
machine73
machine83

上記の両方ともコンマを改行に置き換えます。CASのtrソリューション

grepソリューションは次のとおりです。

$ echo machine23,machine094,machine73,machine83 |grep -o '[^,]*'
machine23
machine094
machine73
machine83

これにより、grep show only(-o)がコンマではなくテキストと一致し、各項目が1行に表示されます。

関連情報