그래서 제가 하려는 작업은 다음과 같습니다. 샘플 CSV 보기:
1,3917,3917,BGP=694|Ethernet=1610|LAG=3,Y
스크립트를 실행한 후 출력은 다음과 유사해야 합니다.
1,3917,3917,BGP=694,Y
1,3917,3917,Ethernet=1610,Y
1,3917,3917,LAG=3,Y
추가 구분 기호가 있는 원본 CSV 파일의 한 행은 이제 4번째 열에 3개의 추가 필드가 있으므로 3개 행으로 변환됩니다.
나는 하루 종일 이것에 대해 연구해왔고 이것이 내가 생각해낸 것입니다. 작동할까요?
암호:
#!/usr/bin/ksh
if [ $# -ne 1 ];
then echo "Usage: read.sh filename";
exit 1;
fi
file="$1"
while read line
do
IFS='|'
set x $line
while [ a -le #$]
do
a=a+1
echo "`$1`,`$a`"
done
done < $1
답변1
대신 AWK를 사용하세요
이 문제는 AWK를 사용하면 훨씬 쉽게 해결할 수 있습니다. 나는 이것을 GNU AWK로 테스트했습니다. 다른 것을 사용한다면 약간 조정해야 할 수도 있습니다.
#!/usr/bin/gawk -f
BEGIN { FS = "|" }
{
split( $3, array, /,/ )
print $1 "," array[2]
print $1 "," $2 "," array[2]
print $1 "," $3
}
스크립트를 어딘가에 저장하세요(예:파싱.awk) 실행 가능한지 확인하세요. 그런 다음 CSV 파일이나 표준 입력에서 스크립트를 호출하고 다음과 같은 결과를 수집할 수 있습니다.
$ echo '1,3917,3917,BGP=694|Ethernet=1610|LAG=3,Y' | parse.awk
1,3917,3917,BGP=694,Y
1,3917,3917,BGP=694,Ethernet=1610,Y
1,3917,3917,BGP=694,LAG=3,Y
답변2
당신이 가지고 있는 것은 파이프 기호로 구분된 그룹화된 값을 포함하는 필드인 것 같습니다.
당신은 그것을 사용할 수 있습니다밀러( mlr
) 이러한 그룹화된 값을 별도의 새 레코드로 "폭발"합니다.
$ mlr --csv -N nest --evar pipe -f 4 file
1,3917,3917,BGP=694,Y
1,3917,3917,Ethernet=1610,Y
1,3917,3917,LAG=3,Y
file
이는 헤더 없는 CSV 파일에서 입력을 읽은 다음 nest
네 번째 필드의 파이프로 구분된 하위 필드를 새 레코드로 나누는 작업을 적용합니다.
반대의 작업을 수행할 수도 있습니다. 즉, 네 번째 필드의 값을 파이프로 구분된 결합된 필드로 "내포"할 수도 있습니다.
$ cat file
1,3917,3917,BGP=694,Y
1,3917,3917,Ethernet=1610,Y
1,3917,3917,LAG=3,Y
$ mlr --csv -N nest --ivar pipe -f 4 file
1,3917,3917,BGP=694|Ethernet=1610|LAG=3,Y
Miller는 CSV를 지원하기 때문에 쉼표나 줄 바꿈이 포함된 필드가 포함된 데이터에는 문제가 발생하지 않습니다.