Linux에서 파일의 마지막 열을 삭제하는 방법

열 번호를 모르는 동안 txt 파일의 마지막 열을 삭제하고 싶습니다. 이다. 어떻게해야하나요?

예 :

입력 :

1223 1234 1323 ... 2222 123 1233 1234 1233 ... 3444 125 0000 5553 3455 ... 2334 222 

그리고 내 출력이 :

1223 1234 1323 ... 2222 1233 1234 1233 ... 3444 0000 5553 3455 ... 2334 

댓글

  • 이 작업을 수행하는 방법에는 여러 가지가 있습니다. 예를 추가하고 예상되는 결과물 ..
  • @heemayl ok I did
  • 감사합니다 .. 열 탭이 분리되어 있습니까 아니면 공백으로 분리되어 있습니까?
  • @heemayl 공간이 구분자입니다.
  • cut는 작업 도구처럼 들립니다.

답변

awk :

awk "NF{NF-=1};1" <in >out 

또는 :

awk "NF{NF--};1" <in >out 

또는 :

awk "NF{--NF};1" <in >out 

이것은 부두처럼 보이지만 작동합니다. 각 awk 명령에는 세 부분이 있습니다.

첫 번째는 두 번째 부분의 전제 조건 인 NF입니다. NF는 한 줄에있는 필드 수를 포함하는 변수입니다. AWK에서 “0이 아니거나 빈 문자열 ""이면 참입니다. 따라서 두 번째 부분 (여기서 NF는 감소됨) NF가 0이 아닌 경우에만 발생합니다.

두 번째 부분 (NF-=1 NF-- 또는 --NF)는 NF 변수에서 하나를 빼는 것입니다. 이렇게하면 마지막 필드가 인쇄되지 않습니다. 필드를 변경하고 (이 경우 마지막 필드 제거) awk $0를 재구성하고 기본적으로 공백으로 구분 된 모든 필드를 연결합니다. . $0에 더 이상 마지막 필드가 포함되지 않았습니다.

마지막 부분은 1입니다. 마술 적이 지 않고 단지 true를 의미하는 표현으로 사용됩니다. awk 표현식이 연결된 작업없이 true로 평가되는 경우 awk 기본 작업은 print $0입니다. .

댓글

  • @JJoao : 아, 감사합니다. --를 잊어 버렸습니다. 현재 POSIX를 준수하려면 ;1가 필요합니다.
  • 초기 본능은 for 루프를 사용하는 것이지만 훨씬 더 간결하고 영리합니다.
  • ' ' 기본이 아닌 구분자를 사용하는 경우 ' 일부 변경이 필요합니다. ,가 구분 자라고 가정하면 : awk -F',' 'BEGIN { OFS = FS }; NF { NF -= 1 }; 1' < in > out
  • NF 감소의 효과는 POSIX에 의해 정의되지 않은 동작입니다. 실행중인 awk에 따라 ' 출력이 달라집니다. 일부 awks는 원하는대로 마지막 필드를 제거하고, 일부는 아무 작업도하지 않으며, 다른 일부는 구문 오류 등을보고 할 수 있습니다.

Answer

PCRE와 함께 grep 사용 :

$ grep -Po ".*(?=\s+[^\s]+$)" file.txt 1223 1234 1323 ... 2222 1233 1234 1233 ... 3444 0000 5553 3455 ... 2334 

GNU sed :

$ sed -r "s/(.*)\s+[^\s]+$/\1/" file.txt 1223 1234 1323 ... 2222 1233 1234 1233 ... 3444 0000 5553 3455 ... 2334 

댓글

  • @ramin 물론입니다. . 새 질문 (이 사이트가 작동하는 방식)으로 질문 해 주시겠습니까? 🙂
  • @ramin 시간 제한이나 경고가 있습니까?
  • 이것은 일반적인 질문이 아닙니다!
  • @ramin Ok .. 관리자에게 연락해 주시면 도움을 드릴 수 있습니다 .. 질문과 관련하여 이전 QA를 확인 했습니까? 질문이 이미 질문되고 답변되었을 가능성이 있습니다.
  • ' " Linux에서 파일 이름을 어떻게 바꿀 수 있나요 ". Google을 사용하세요.

답변

Perl 사용 :

perl -lane "$,=" ";pop(@F);print(@F)" in 

rev + cut 사용 :

rev in | cut -d " " -f 2- | rev 

답변

GNU sed 사용 :

sed -r "s/\s+\S+$//" input.txt 

좀 더 일반적으로이 항목 OSX의 BSD 및 GNU sed에서 작동합니다.

sed "s/[[:space:]]\{1,\}[^[:space:]]\{1,\}$//" input.txt 

Answer

구분자가 항상 단일 문자 인 경우 (두 개 이상의 연속 된 구분자가 빈 필드를 지정 함) 입력 파일의 첫 번째 줄만 head, 구분 기호 ( n 구분 기호는 필드 수가 n+1임을 의미) cut를 사용하여 1 첫 번째 필드에서 n 번째 필드까지 (두 번째에서 마지막 필드까지), 예 : 탭으로 구분 된 입력 :

n=$(head -n 1 infile | tr -dc \\t | tr \\t \\n | wc -l) cut -f1-$n infile > outfile 

또는 예 : csv 파일 사용 :

n=$(head -n 1 infile | tr -dc , | tr , \\n | wc -l) cut -d, -f1-$n infile > outfile 

시간이 있다면 나중에 벤치 마크를 실행하겠습니다. 솔루션은 정규식을 사용하는 다른 솔루션보다 빠릅니다. 첫 번째 줄에서 최소한의 처리를 수행하여 필드 수를 얻은 다음이 작업에 최적화 된 cut를 사용합니다.

답변

휴대용으로 다음 중 하나를 사용할 수 있습니다.

sed "s/[[:space:]]*[^[:space:]]*$//" file awk "{sub(/[[:space:]]*[^[:space:]]*$/,"")}1" file 

답변

vim 사용 :

vim에서 파일 열기

vim <filename> 

커서가 다른 곳에있는 경우를 대비하여 첫 번째 행으로 이동합니다.

gg 

“q”라는 이름의 매크로를 만듭니다. qq, 현재 줄 $의 뒤로 이동 한 다음 마지막 공백으로 돌아갑니다. F (대문자 F, 뒤에 리터럴 SPACE) 그런 다음 현재 위치에서 줄 끝까지 삭제 D 다음 줄 j로 이동하고 q를 사용하여 매크로 기록을 중지합니다.

qq$F Djq 

이제 각 줄에 대해 @q를 사용하여 매크로를 반복 할 수 있습니다.
@@ 마지막 매크로를 반복하거나 더 쉽게 :

99@q 

매크로를 99 번 반복합니다.
참고 : 숫자는 행과 정확히 일치하지 않아야합니다.

답변

비슷한 문제가 있지만 필드 구분 기호가 다른 사람들을 위해이 awk 메소드는 필드 구분자를 올바르게 유지합니다.

$ cat file foo.bar.baz baz.bar.foo $ awk -F"." "sub(FS $NF,x)" file foo.bar baz.bar 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다