열 번호가 무엇인지 모르는 동안 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
열 번호가 무엇인지 모르는 동안 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
답변:
로 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이 아니거나 빈 문자열 인 경우 상황이 true ""
입니다. 따라서 두 번째 부분 ( NF
감소 되는 위치) 은 NF
0이 아닌 경우에만 발생합니다 .
두 번째 부분 ( NF-=1
NF--
또는 --NF
)은 NF
변수 에서 하나를 빼는 것입니다 . 필드를 변경할 때 (이 경우 마지막 필드 제거) 기본적으로 공백으로 구분 된 모든 필드를 awk
재구성 $0
하고 연결 하기 때문에 마지막 필드가 인쇄되지 않습니다 . $0
더 이상 마지막 필드를 포함하지 않았습니다.
마지막 부분은 1
입니다. 그것은 마법이 아니며 단지 의미하는 표현으로 사용됩니다 true
. 경우 awk
모든 관련 조치없이 true로 표현 평가하여, awk
기본 동작입니다 print $0
.
--
. 현재 ;1
POSIX 호환 이 필요 합니다.
,
당신의 구분자가 있다고 가정 :awk -F',' 'BEGIN { OFS = FS }; NF { NF -= 1 }; 1' < in > out
grep
PCRE와 함께 사용 :
$ 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
분리 문자가 항상 단일 문자 인 경우 (두 개 이상의 연속 분리 문자가 빈 필드를 지정 함) head
입력 파일의 첫 번째 행만 분리 문자를 계산하고 ( n
구분 기호는 필드 수를 의미 함 n+1
) st 필드 cut
에서 인쇄 하는 데 사용 1
합니다. n
탭으로 구분 된 입력 을 사용하여 최대 th 필드까지 (두 번째에서 마지막 필드 까지 ) :
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
이 작업에 최적화 된 필드를 사용합니다 .
vim 사용하기 :
vim에서 파일 열기
vim <filename>
커서가 다른 곳에있을 경우를 대비하여 첫 번째 행으로 이동하십시오.
gg
"Q"라는 매크로 만들기 qq
현재 라인의 뒤쪽으로 이동, $
다음 마지막 공간으로 돌아갑니다, F
(문자 공백 자본 F) 다음 라인의 끝을 통해 현재 위치에서 삭제 D
다음 라인에 가서 j
하고 로 매크로 기록을 중지하십시오 q
.
qq$F Djq
이제 @q
각 줄마다 매크로를 반복 할 수 있습니다 .
를 눌러 @@
마지막 매크로를 반복하거나 더 쉽게 할 수도 있습니다 .
99@q
매크로를 99 번 반복합니다.
참고 : 숫자가 줄과 정확히 일치하지 않아야합니다.