다음과 같은 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
start, end 및 around 에서 따옴표를 제거합니다 |
.
지금까지 이 코드는 작동합니다:
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
첫째, 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
답변2
이것은 또한 작동합니다:
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
'
답변3
sed
나를 위해 일한 명령은 다음과 같습니다.
sed 's/ALA/A/g;s/CYS/C/g;s/ASP/D/g;s/GLU/E/g;s/PHE/F/g;s/GLY/G/g;s/HIS/H/g;s/HID/H/g;s/HIE/H/g;s/ILE/I/g;s/LYS/K/g;s/LEU/L/g;s/MET/M/g;s/ASN/N/g;s/PRO/P/g;s/GLN/Q/g;s/ARG/R/g;s/SER/S/g;s/THR/T/g;s/VAL/V/g;s/TRP/W/g;s/TYR/Y/g;s/MSE/X/g;s/ //g' < old.txt > new.fasta
sed 명령은 파이프될 수 없습니다. 단일 명령으로 제공되어야 합니다.