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
감소가 발생하는 부분)은 NF
0이 아닌 경우에만 발생합니다.
두 번째 부분( 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
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
답변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
해당 작업에 최적화된 필드를 사용하세요.