|
파이프 구분 기호( )를 사용하여 열 4를 grep하고 그 안의 모든 큰따옴표를 바꾼 다음 문자열을 다시 큰따옴표로 묶으려고 합니다 .
샘플 파일:
col1|col2|col3|col4|col5|col6|col7|col8|col9
value1|value2|value3|"|||||value"4|value5|value6|"||value"7|value8|value9
문제는 4열에 사용자가 무엇이든 쓸 수 있다는 것입니다. 심지어 파이프까지 쓸 수 있는데, 이는 구분 기호이고 이로 인해 프로세스가 중단됩니다.
예를 들어 열 4는 다음과 같을 수 있습니다.
"|||||value"4
이제 4열로 이동하여 큰따옴표를 모두 바꾼 다음 다시 큰따옴표로 묶어 프로세스가 작동하도록 하는 명령을 작성하려고 합니다.
열 4에 대해 원하는 출력은 다음과 같습니다.
"|||||value4"
마찬가지로 열 7에 대해서도 동일한 작업을 수행했으며 열 7에 대해 원하는 출력은 다음과 같습니다.
"||value7"
최종 출력은 다음과 같아야 합니다.
col1|col2|col3|col4|col5|col6|col7|col8|col9
value1|value2|value3|"|||||value4"|value5|value6|"||value7"|value8|value9
제안해주세요.
답변1
사용csvkit
:
$ csvformat -d '|' -D '|' file.csv
col1|col2|col3|col4|col5
test|test_f|21/03/2017|"|||||USER RIGHTa anything here"|123
-d
및 플래그는 -D
입력과 출력에 각각 사용되는 구분 기호를 정의합니다.
답변2
그리고sed
5개의 열만 있고 해당 사례에서 참조해야 하는 열은 4열이라고 가정합니다.
sed -E 's/"//g; s/^(([^|]*\|){3})(.*)(\|[^|]*)$/\1"\3"\4/' infile
사용자가 따옴표를 입력하지 않더라도 사용자나 파이프가 따옴표를 입력하면 작동합니다.
이것은awk
요청에 따른 솔루션:
$ awk -F'|' '{ for (i=1; i<NF; i++){if (i>3)gsub("\"","");
printf (i!=(NF-1))?$i"|"((i==3)?"\"":""):$i"\"|"}; print $NF}' infile
col1|col2|col3|"col4"|col5
test|test_f|21/03/2017|"|||||USER RIGHTa anything here"|123