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

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

답변1

그리고 awk:

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

또는:

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

또는:

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

이것은 부두교처럼 보일 수도 있지만 실제로는 효과가 있습니다. 모든 awk 명령은 세 부분으로 구성됩니다.

첫 번째는 NF, 이것이 2부의 전제입니다. NF행의 필드 수를 포함하는 변수입니다. AWK에서는 0이 아니거나 빈 문자열이 아닌 경우 true입니다 "". 따라서 두 번째 부분( NF감소가 발생하는 부분)은 NF0이 아닌 경우에만 발생합니다.

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

마지막 부분은 입니다 1. 그것은 마법적인 것이 아니며 단지 무언가를 의미하는 표현으로 사용됩니다 true. awk표현식이 true로 평가되고 연관된 작업이 없는 경우 awk기본 작업은 입니다 print $0.

답변2

펄 사용:

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

rev+를 사용하세요 cut:

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

답변3

grepPCRE와 함께 사용:

$ 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

답변4

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

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

또는 예를 들어데이터 세트문서:

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

나중에 시간이 있으면 몇 가지 벤치마크를 실행해 보겠습니다. 하지만 입력을 많이 하면 이 솔루션이 정규식을 사용하는 다른 솔루션보다 더 빠를 것이라고 생각합니다. 왜냐하면 이 솔루션은 No를 얻기 위해 프로세스의 첫 번째 줄에서 최소한의 작업을 수행하기 때문입니다. 필드를 선택한 후 cut해당 작업에 최적화된 필드를 사용하세요.

관련 정보