텍스트 중간에서 파이프()를 제거 해야 하기 때문에 파이프로 구분된( ) 데이터 |
로 열 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"
.