Linux에서 파일 내용 분할

Linux에서 파일 내용 분할

다음 내용이 포함된 텍스트 파일이 있습니다.

abc.tar^@xxx.tar^@yyy.tar^@ 

예를 들어, 이라는 파일에 이 콘텐츠가 있고 abc.txt해당 콘텐츠를 분할하여 처음 두 항목을 새 파일에 쓰고 싶습니다.

(예를 들어) 새 파일은 다음과 같습니다.

abc.tar^@xxx.tar^@

이 작업을 수행하는 명령이 있습니까?

답변1

이것은:

awk -F"@" '{print $1"@"$2"@"}' abc.txt > newfile.txt

당신에게 충분합니까?

답변2

다음을 실행해 보세요.

sed -r -i 's/^(.*)@.*@.*$/\1/' file

답변3

문제는 다음과 관련이 있는 것 같아요.저것, 옳은?

이 경우 "^@"를 줄바꿈으로 바꾸는 것이 더 가치가 있지 않습니까? 아래에서는 ASCII NUL 바이트인 "^@"을 의미하는 것 같습니다.

$ sed 's/\o000/\n/g' abc.txt | head -n 2
abc.tar
xxx.tar

그래서 당신은 필요

sed 's/\o000/\n/g' abc.txt | head -n 2 > newfile.txt

설명하다

이는 \n각 NUL 바이트( )를 개행 문자( \o000)로 대체합니다. 즉 \o, 그 뒤에 8진수 표기법으로 바이트가 옵니다. 그런 다음 출력은 파이프로 연결되어 head -n 2처음 두 줄을 추출합니다. 결과 줄은 >파일로 리디렉션됩니다( ) newfile.txt.

그러나 파일 이름을 "^@"로 구분하는 것이 중요한 경우 다음을 사용할 수 있습니다.

perl -nl000 -e '
    $num_lines =2 ;
    push @a,(split /\000/)[0..$num_lines-1];
    print $_ for @a' abc.txt > newfile.txt

$num_lines파일에서 첫 번째 줄을 가져오려면 필요에 따라 위의 값을 바꾸십시오 .$num_lines

설명하다

  • -n스위치는 perl입력 파일의 각 줄에서 코드가 실행되도록 지시합니다.
  • -l000시퀀스는 perl출력 레코드 구분 기호(각 문자열 뒤에 인쇄되는 문자)가 NUL 바이트( 000)로 설정되었음을 나타냅니다.
  • 이 스위치는 다음 문자열이 실행될 코드임을 -e나타냅니다 .perl
  • split함수는 NUL 바이트를 구분 기호로 사용하여 각 입력 라인을 분할하고 첫 번째 $num_lines( [0..$num_lines-1]) 결과를 가져와 배열에 넣습니다 @a. 함수 호출에서는 "현재 입력 라인" 부분이 지정되지 않습니다. 이는 인수가 제공되지 않을 때 Perl() $_의 기본 스칼라 변수가 함수(및 기타)의 기본 인수라는 사실을 활용합니다.split
  • 마지막 foreach루프는 각 요소를 인쇄합니다 @a( $_루프의 기본 반복자가 어떻게 되는지 다시 한번 확인하세요 foreach). 출력 레코드 구분 기호를 octal 로 설정했기 때문에 000이전과 같이 NUL 바이트로 구분된 결과를 얻습니다.

답변4

awk는 모든 문자를 레코드 구분 기호로 사용할 수 있지만(기본적으로 개행이 사용됨) 일부 구현에서는 null 바이트를 구분 기호로 지원하지 않습니다. Gawk(GNU awk)는 대부분의 비임베디드 Linux 설치의 기본 awk이며 null을 지원합니다.

gawk -v RS='\0' -v ORS='\0' 'NR <= 2 {print}'

gawk -v RS='\0' -v ORS='\0' 'NR <= 2'레코드 인쇄가 기본 작업이므로 이 작업은 단축될 수 있습니다 .

대용량 파일의 경우 두 번째 줄 이후에 종료하는 것이 가장 좋습니다.

gawk -v RS='\0' -v ORS='\0' 'NR==3 {exit} {print}'

또는 를 사용할 수 있습니다 head. 레코드 구분 기호로 줄 바꿈 대신 널 바이트를 사용하는 옵션은 없지만 두 문자를 바꾸고 를 호출한 head다음 다시 바꿀 수 있습니다.

tr '\0\n' '\n\0' | head -n 2 | tr '\0\n' '\n\0'

관련 정보