シェルスクリプト - CSVファイルの行を読み取り、セルに複数の値の接頭辞を付けます。

シェルスクリプト - CSVファイルの行を読み取り、セルに複数の値の接頭辞を付けます。

このようなcsvファイルがあります。

aaa|c1|bbb|t1
bbb|c1,c2|nnn|t1,t2

パイプはセパレータです。列2と列4を含む文字列を生成したいと思います。そして、2つの列値にプレフィックスを追加する必要があります。

列 2 =aプレフィックスです。列 4 =bプレフィックスです。

予想出力:

this is final string a.c1=b.t1
this is final string a.c1,a.c2=-b.t1,b,t2

私のサンプルスクリプト(完了):

while read r_line
do
c2 = $(echo $r_line|awk -F'|' '{print $2}')
c4 = $(echo $r_file |awk -F'|' '{print $4}')
out=$("this is final string a.$c2=b.$c4")
done < csv file

ここで、c2 または t2 にコンマ区切りの値がある場合、これらの 2 つの値にプレフィックスを適用する必要があります。

答え1

bashcsvファイルを配列に読み込み、最初にパラメータ置換を実行して2番目の4番目のフィールドを出力します。

while IFS='|' read -ra a;do
  echo This is the final string: \
    "a.${a[1]//,/,a.}=b.${a[3]//,/,b.}"
done < csvfile

答え2

sedメソッドを使用してください。

prefix1=a.
prefix2=b.
while read r_line; do
    c2=$(echo $r_line | cut -d'|' -f2)
    c4=$(echo $r_line | cut -d'|' -f4)
    s1=$(echo $c2 | sed "s/,/,$prefix1/g" | sed "s/^/$prefix1/g")
    s2=$(echo $c4 | sed "s/,/,$prefix2/g" | sed "s/^/$prefix2/g")
    echo "this is final string $s1=$s2"
done

スクリプトはヘッドで最後に検索、,置換、追加します。私は文字列を分割するために使用するのが好きです。,$prefix$prefixcut

答え3

各行を読み、それを使用してcut各フィールドとその目的を達成できますsed

while read -r line; do
a="$(cut -d'|' -f2 <<<"$line")"
b="$(cut -d'|' -f4 <<<"$line")"
a="$(echo "$a"|sed -e 's/^/a./' -e 's/,/,a./g')"
b="$(echo "$b"|sed -e 's/^/b./' -e 's/,/,b./g')"
echo "this is final string $a=$b"
done < csv_file 

答え4

完全なawkソリューション

awkファイル(se.awk)

BEGIN { FS="|" }
{
  a="" ; n=split($2,A,",") ; for (i=1;i<=n;i++) a = a ",a." A[i] ;
  b="" ; n=split($4,B,",") ; for (i=1;i<=n;i++) b = b ",b." B[i] ;
  printf "%s %s=%s\n",prefix,substr(a,2),substr(b,2) ;
}

~と呼ばれる

awk -v prefix="this is final string" -f se.awk c
this is final string a.c1=b.t1
this is final string a.c1,a.c2=b.t1,b.t2

どこ

  • -v prefix="this is final string"prefixコマンドラインでvarを設定する
  • BEGIN { FS="|" }|awkに区切り文字として使用するように指示する
  • a="" ; n=split($2,A,",")2番目のフィールドを分割し,て数を数えます。
  • for (i=1;i<=n;i++) a = a ",a." A[i] 不要なカンマを前に置き、予想される文字列を作成します。
  • (4番目のbも同様)
  • prefix="this is final string" printf を使用して文字列を結合し、カンマを削除します。

プレフィックスが固定されている場合は、awkプログラムに挿入できます。

BEGIN { 
  FS="|" ;
  prefix="this is prefix" ; 
}

関連情報