CSV 파일을 처리하기 위해 하나의 스크립트에서 여러 sed 명령을 결합


34

다음과 같은 CSV 파일이 있습니다.

HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER

다음과 같은 결과를 찾습니다.

HEADER
first, column|second "some random quotes" column|third ol' column

즉, "FOOTER"를 제거하면 시작, 끝 및 주위의 따옴표가 |

지금 까지이 코드는 작동합니다.

sed '/FOOTER/d' csv > csv1 | #remove FOOTER
sed 's/^\"//' csv1 > csv2 | #remove quote at the beginning
sed 's/\"$//' csv2 > csv3 | #remove quote at the end
sed 's/\"|\"/|/g' csv3 > csv4 #remove quotes around pipe

보시다시피 문제는 4 개의 추가 파일을 생성한다는 것입니다.

추가 파일을 만들지 않고 단일 스크립트에서 동일한 작업을 수행하는 목표를 가진 또 다른 솔루션이 있습니다. 잘 작동하지 않습니다.

#!/bin/ksh

sed '/begin/, /end/ { 
        /FOOTER/d
        s/^\"//
        s/\"$//
        s/\"|\"/|/g 
}' csv > csv4

1
따옴표가 있으므로 필드에 줄 바꿈을 할 수 있습니다. 당신 sed은 단순화 된 CSV로만 작동하지 않을 것입니다. 실제 CSV 파일 (Python / Perl / Ruby)을 처리 할 수있는 라이브러리와 함께 프로그래밍 언어를 사용하십시오.
Anthon

답변:


44

우선 Michael이 보여 주듯이,이 모든 것을 하나의 명령으로 결합 할 수 있습니다.

sed '/^FOOTER/d; s/^\"//; s/\"$//; s/\"|\"/|/g' csv > csv1

일부 sed구현은 그에 대처할 수 없으며 필요할 수 있습니다.

  sed -e '/^FOOTER/d' -e 's/^\"//' -e 's/\"$//' -e 's/\"|\"/|/g' csv > csv1

즉, 필드가 정의 된 것처럼 보이고 전체 필드 주위 |를 제거 "하고 필드 내에있는 필드를 남겨두고 싶습니다 . 이 경우 다음을 수행 할 수 있습니다.

$ sed '/FOOTER/d; s/\(^\||\)"/\1/g; s/"\($\||\)/\1/g' csv 
HEADER
first, column|second "some random quotes" column|third ol' column

또는 GNU의 경우 sed:

sed -r '/FOOTER/d; s/(^|\|)"/\1/g; s/"($|\|)/\1/g' csv 

Perl을 사용할 수도 있습니다.

$ perl -F"|" -lane 'next if /FOOTER/; s/^"|"$// for @F; print @F' csv 
HEADER
first, column|second some random quotes column|third ol' column

13

이것은 또한 작동합니다 :

sed 's / ^ "//; s /"| "/ | / g; s /" "$ /"/'

예:

$ echo '"this"|" and "ths""|" and "|" this 2"|" also "this", "thi", "and th""' | 
sed 's/^"//; s/"|"/|/g; s/""$/"/'
this| and "ths"| and | this 2| also "this", "thi", "and th"

예쁜 버전

sed '
s/^"//
s/"|"/|/g
s/""$/"/
$d
'

1
이것은 바닥 글을 다루지 않습니다.
terdon

3
그러나 내용에 관계없이 마지막 줄이 제거됩니다. 이 없으면 FOOTER원하는 데이터를 제거합니다.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.