シェル - 値をカンマ区切り文字列として印刷します。

シェル - 値をカンマ区切り文字列として印刷します。

カンマ区切り値を含むtxtファイルがあります。

cat file.txt

abc,def,ghi
abc,ghi
def,abc,ghi
def,abc
abc,def
abc,def,ghi

while do read line from fileこの値をカンマで区切って印刷したいと思います。

たとえば、

expecting output for Line no 1:
first col=abc
second col=def
third col=ghi
expecting output for Line no 2:
first col=abc
second col=ghi

行に3つの値がある場合は、読み取った行を印刷する必要があります。

first col=value
second col=value
third col=value

その他

first col=value
second col=value

このシェルスクリプトをどのように作成できますか?

答え1

bashを使えばできます

ordinals=( first second third fourth fifth sixth )
n=0
while IFS=, read -ra cols; do
    echo "line $((++n))"
    for i in "${!cols[@]}"; do
        echo "${ordinals[i]} col=${cols[i]}"
    done
done < file

各行の単語をという配列で読み取ってからcols実行します。索引値を序数に関連付けることができるように、この配列の値。

最初の3行について、私たちは次のようになります。

line 1
first col=abc
second col=def
third col=ghi
line 2
first col=abc
second col=ghi
line 3
first col=def
second col=abc
third col=ghi

答え2

$ awk -F, '{ print "line " NR; for (i=1;i<=NF;i++) { print "Col " i "="$i } }' input
line 1
Col 1=abc
Col 2=def
Col 3=ghi
line 2
Col 1=abc
Col 2=ghi
line 3
Col 1=def
Col 2=abc
Col 3=ghi
line 4
Col 1=def
Col 2=abc
line 5
Col 1=abc
Col 2=def
line 6
Col 1=abc
Col 2=def
Col 3=ghi

数値列を「最初」、「2番目」などに翻訳したい場合は、配列を定義し、それをiインデックスとして使用して、数値に一致する単語を見つけることができます。

答え3

入力ファイルに最大3つの列しかないと仮定すると、次はwhile-loopを使用してread標準入力からコンマ区切りの値を読み取り、表示されたものと同様の形式で出力します。

#!/bin/sh

while IFS=, read -r first second third
do
    printf 'Line %d:\n' "$(( ++n ))"
    ${first:+printf 'First:\t%s\n' "$first"}
    ${second:+printf 'Second:\t%s\n' "$second"}
    ${third:+printf 'Third:\t%s\n' "$third"}
done

パラメータ拡張は、が設定されていて空でない場合${variable:+word}に拡張されます。その変数に印刷するデータが含まれている場合、コードはそれを使用して出力を実行します。wordvariableprintf

提供されたデータをテストします。

$ ./script.sh <file
Line 1:
First:  abc
Second: def
Third:  ghi
Line 2:
First:  abc
Second: ghi
Line 3:
First:  def
Second: abc
Third:  ghi
Line 4:
First:  def
Second: abc
Line 5:
First:  abc
Second: def
Line 6:
First:  abc
Second: def
Third:  ghi

関連情報