파일의 각 줄을 자르는 유닉스 명령

파일의 각 줄을 자르는 유닉스 명령

CSV 파일이 있는데 세 번째 세미콜론부터 자르고 싶습니다. 예를 들어 다음 파일이 있는 경우:

1;foo;bar;baz;x;y;z
2;foo;bar;baz;x;y;z
3;foo;bar;baz;x;y;z

다음 출력을 얻고 싶습니다.

1;foo;bar
2;foo;bar
3;foo;bar

이를 달성하기 위해 어떤 Unix 명령을 사용할 수 있는지 모르겠습니다. 어떤 제안이 있나요?

이 작업은 KSH 스크립트에서 수행됩니다.

답변1

다양성을 위해 또 다른 접근 방식이 있습니다 cut.

cut -d \; -f -3

답변2

이렇게 하면 귀하가 요청한 작업이 수행됩니다.

awk -F';' '{print $1 ";" $2 ";" $3;}' <input >output

awk유틸리티는 이 작업을 위해 설계되었습니다. 개별 행을 필드로 쉽게 분할한 다음 이를 기반으로 작업할 수 있습니다. 매개변수는 필드 구분자 로 사용하도록 -F';'지시합니다 . 따옴표가 없으면 쉘은 이를 명령 구분 기호로 해석하므로 따옴표가 필요합니다 .awk;;

실행을 위해 awk에 제공된 명령의 각 행(비트)도 인용되어 모든 흥미로운 문자( , 및 이 경우)가 셸에서 특별하게 처리되는 것을 '{print $1 ";" $2 ";" $3;}'방지 하고 전체 문자가 단일 문자로 전달되도록 합니다. 단위.{}$";awk

물론 명령의 입력과 출력을 파일로 리디렉션하기 위해 쉘에 제공되는 리디렉션 지침입니다 <input.>output

답변3

쉘에 의존하지 않는 awk를 사용하여 이 작업을 수행할 수 있습니다. 출력을 임시 파일에 쓴 다음 이를 기존 파일 위로 이동해야 합니다.

awk -F';' 'BEGIN { OFS=";" } { print $1,$2,$3 }' file.txt > newfile.txt
mv newfile.txt file.txt 

답변4

펄 사용하기

~$ perl -lane '   @F =  split(";"); print join ";", @F[0..2];'  file

음악을 활용하세요(이전 Perl_6)

$~ raku   -ne 'my @F = .split(";");   put join ";", @F[0..2];'  file   

Perl과 Raku를 사용한 두 가지 답변은 다음과 같습니다. 데이터를 한 줄씩 읽으려면 Perl -lane또는 Raku의 비자동 인쇄 플래그를 사용하십시오. -ne(차이점은 Raku가 -l기본적으로 자동 자르기를 수행하지만 Raku에는 해당 플래그가 없다는 것입니다 -a.)

이후 코드는 사실상 동일합니다. Raku에서는 @F(or @G, or @H배열 등) 을 선언하려면 or (범위 설명자)를 사용해야 합니다 . 라쿠도 표시해 달라고 부탁해요myour무엇호출 중인 객체 split( 읽을 때 개별 데이터 행을 보유하는 .split테마 변수의 $_.split약자 )입니다.$_

결국 print(Perl) 또는 put(Raku)를 선택해야 합니다. Raku print에도 있지만 put개행 문자가 추가됩니다.

입력 예:

1;foo;bar;baz;x;y;z
2;foo;bar;baz;x;y;z
3;foo;bar;baz;x;y;z

예제 출력:

1;foo;bar
2;foo;bar
3;foo;bar

펄 참조:
https://perldoc.perl.org
https://www.perl.org

Leku 참고 자료:
https://docs.raku.org
https://raku.org

관련 정보