대용량 파일의 각 줄에서 마지막 두 개의 "구분된 문자열"을 제거하는 방법

대용량 파일의 각 줄에서 마지막 두 개의 "구분된 문자열"을 제거하는 방법

소스 시스템에 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 옵션은 값을 표준 출력으로 파이프합니다.@Fslice$_$" 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"}'

관련 정보