소스 시스템에 2GB 공간으로 구분된 파일이 많이 있습니다. 각 파일의 각 줄에는 텍스트 한정자로 "로 묶인 동일한 수의 문자열이 포함되어 있습니다.
모든 파일의 모든 줄에서 마지막 두 문자열과 해당 텍스트 한정자를 제거해야 합니다. (열 형식 보고서에서 마지막 두 열을 제거하는 것과 같습니다). 더 작은 파일의 경우 Excel로 가져오고, 열을 구분하고, 제거하고, 탭으로 구분하여 저장할 수 있습니다(공백보다 훨씬 유용함).
그럼에도 불구하고 이러한 파일은 너무 커서 Excel에서 처리하기에는 행이 너무 많습니다. 그래서 sed
? ?
"text1" "text2" "text3" "text4" "text5" "text6"
각 줄에는 동일한 수의 문자열이 있습니다. 각 줄에서 "text5" "text6"을 제거하는 방법은 무엇입니까?
답변1
항상 마지막 두 열을 삭제하고 싶다면 다음 관용구를 사용할 수 있습니다.
awk 'NF-=2' file
나는 이것이 작동하지 않는다는 것을 알았습니다 nawk
. 왜 그런지 모르겠습니다. 이식 가능한 방법은 `$1=$1:을 사용하여 필드 분할을 강제하는 것입니다.
awk '{NF-=2} $1=$1' file
산출:
"text1" "text2" "text3" "text4"
답변2
이 sed
명령은 파일의 각 줄 끝에서 공백으로 구분된 따옴표로 묶인 마지막 두 문자열을 제거하고 infile
결과를 다음으로 보냅니다 outfile
.
sed 's/ *"[^"]*" *"[^"]*" *$//' < infile > outfile
답변3
awk '{$(NF-1)=$NF=""}1' inp
perl -pale '$_ = "@F[0..@F-3]"' inp
sed -ne '
s/" "/"\
"/g
:a
s/\n/ /
/\n.*\n.*\n/ba
P
' inp
설명하다:
awk
코드는 마지막 필드와 끝에서 두 번째 필드를 지우고 인쇄합니다.- In 필드는 배열
perl
에 저장되고 0번째부터 세 번째, 마지막까지의 필드가 선택되어 현재 행에 저장됩니다 . 큰따옴표는 배열->문자열 변환을 구현하는 데 사용되며 기본값은 공백으로 함께 연결됩니다. 그런 다음 Perl 옵션은 값을 표준 출력으로 파이프합니다.@F
slice
$_
$"
superglobal
-p
$_
sed
먼저 모든 모드를 전환한 다음" "
--->"\n"
루프에 들어가\n
두 개의 모드가 남을 때까지 후퇴합니다. 이 시점에서P
대문자 p, 명령을 사용하여 패턴 공간의 첫 번째 부분을 인쇄합니다.
답변4
마지막 2..AWK까지 각 필드를 인쇄합니다. AWK는 연속된 필드 수를 제공하는 변수 NF를 사용합니다.
echo "text1" "text2" "text3" "text4" "text5" "text6" | awk -v ORS="" '{
for(i=1;i<=NF-2;i++)print $i, " " ; print "\n"}'