쉘 스크립트 - CSV 파일 행을 읽고 셀에 여러 값의 접두사를 붙입니다.

쉘 스크립트 - CSV 파일 행을 읽고 셀에 여러 값의 접두사를 붙입니다.

이와 같은 csv 파일이 있습니다.

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

파이프는 분리기입니다. 열 2와 열 4를 포함하는 문자열을 생성하고 싶습니다. 그리고 두 개의 열 값에 접두사를 추가해야 합니다.

열 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에 쉼표로 구분된 값이 있으면 이 두 값에 접두사를 적용해야 합니다.

답변1

bashcsv 파일을 배열로 읽어온 다음 먼저 매개변수 대체를 수행하여 두 번째 네 번째 필드를 출력하면 됩니다.

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,",")두 번째 필드를 분할 ,하고 개수를 계산합니다.
  • 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" ; 
}

관련 정보