찾아 awk로 바꾸기

찾아 awk로 바꾸기

|파이프 구분 기호( )를 사용하여 열 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

그리고sed5개의 열만 있고 해당 사례에서 참조해야 하는 열은 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

관련 정보