열 번호를 모르는 동안 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이 아니거나 빈 문자열 ""
이면 참입니다. 따라서 두 번째 부분 (여기서 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
cut
는 작업 도구처럼 들립니다.