awk 명령을 사용하여 파이프 찾기 및 바꾸기

awk 명령을 사용하여 파이프 찾기 및 바꾸기

텍스트 중간에서 파이프()를 제거 해야 하기 때문에 파이프로 구분된( ) 데이터 |로 열 7을 grep하려고 합니다.|

샘플 파일:

col1|col2|col3|col4|col5|col6|col7|col8|col9|col10
value1|value2|value3|value4|value5|value6|"value7|text"|value8|value9|value10

|7열에 대한 질문: 텍스트 중간부터 삭제 해야 합니다 .value7|text

열 7에 대해 원하는 출력은 다음과 같습니다.value7 text

|이제 프로세스가 작동하도록 단일 문자열로 처리할 수 있도록 ( ) 파이프를 공백으로 대체하여 열 7로 이동하는 awk 명령을 작성하려고 합니다 .

최종 출력은 다음과 같아야 합니다.

col1|col2|col3|col4|col5|col6|col7|col8|col9|col10
value1|value2|value3|value4|value5|value6|"value7 text"|value8|value9|value10

제안해주세요.

감사해요,

답변1

데이터가 올바른 형식의 CSV 데이터로 나타나므로 CSV 파서를 사용할 수 있습니다.

$ csvformat -d '|' file | tr '|' ' ' | csvformat -D '|'
col1|col2|col3|col4|col5|col6|col7|col8|col9|col10
value1|value2|value3|value4|value5|value6|value7 text|value8|value9|value10

이것은 csvformat다음에서 사용됩니다.csvkit|--구분된 데이터를 쉼표로 구분된 데이터로 다시 포맷합니다 . tr그런 다음 나머지 파이프 기호를 공백으로 바꿉니다. 마지막으로 csvformat쉼표로 구분된 데이터를 |--separated 형식으로 다시 포맷하는 데 다시 사용됩니다.

큰따옴표 는 csvformat필요할 때나 if를 사용할 때만 필드에 추가됩니다(이 경우 모든 필드에 큰따옴표가 추가됩니다).-U 1

답변2

다음 awk 명령을 사용하여 테스트하면 잘 작동합니다.

awk -F '"' '{gsub(/\|/," ",$2);print $0}' filename

산출

col1|col2|col3|col4|col5|col6|col7|col8|col9|col10
value1|value2|value3|value4|value5|value6| value7 text |value8|value9|value10

답변3

이 시도,

sed 's/\(".*\)|\(.*"\)/\1 \2/g' file

부인 성명:나는 이것을 권장하지 않습니다. 대신 이와 같은 추악한 해결 방법을 도입하는 대신 제대로 작동하도록 프로세스를 수정하십시오. 귀하의 데이터는 일반 CSV(또는 "PSV")이며 적합한 CSV 파서로 쉽게 읽을 수 있습니다.

다음과 같은 필드가 있으면 문제가 발생합니다 value\"6|"value7|test".

관련 정보