약 1000 만 줄의 파일이 있습니다.
파일에서 6 자 미만의 모든 줄을 제거하고 싶습니다.
어떻게해야합니까?
답변
이를 수행하는 방법에는 여러 가지가 있습니다.
사용 grep
:
grep -E '^.{6,}$' file.txt >out.txt
이제 out.txt
6 자 이상의 문자가있는 줄이 포함됩니다.
반대 방향 :
grep -vE '^.{,5}$' file.txt >out.txt
를 사용하여 sed
길이가 5 이하인 줄을 제거합니다.
sed -r '/^.{,5}$/d' file.txt
길이가 6 이상인 라인 인쇄 :
sed -nr '/^.{6,}$/p' file.txt
>
연산자와 같은 연산자를 사용하여 출력을 다른 파일로 저장 grep
하거나 다음 -i
옵션을 사용하여 파일을 제자리에서 편집 할 수 있습니다 sed
.
sed -ri.bak '/^.{6,}$/' file.txt
원본 파일은 그대로 백업되고 file.txt.bak
수정 된 파일은입니다 file.txt
.
백업을 유지하지 않으려면 다음을 수행하십시오.
sed -ri '/^.{6,}$/' file.txt
shell, Slower, Do not do을 사용하면 다른 방법을 보여주기위한 것입니다.
while IFS= read -r line; do [ "${#line}" -ge 6 ] && echo "$line"; done <file.txt
사용 python
, 심지어 느린보다 grep
, sed
:
#!/usr/bin/env python2
with open('file.txt') as f:
for line in f:
if len(line.rstrip('\n')) >= 6:
print line.rstrip('\n')
파이썬을 더 잘 사용하기 위해 목록 이해력을 향상시키는 것이 좋습니다.
#!/usr/bin/env python2
with open('file.txt') as f:
strip = str.rstrip
print '\n'.join([line for line in f if len(strip(line, '\n')) >= 6]).rstrip('\n')
답변
매우 간단합니다.
grep ...... inputfile > resultfile #There are 6 dots
이 같은 매우 효율적이다 grep
가 필요한 것보다 더 많은 구문 분석하려고하지 않으며, 어떠한 방법으로 문자를 해석 : 그것은 단순히 표준 출력 (전체) 선 (쉘이 다음 resultfile로 리디렉션하는) 보내 빨리으로 이 6 보았다 해당 줄의 문자 ( .
regexp 컨텍스트에서 1 문자와 일치).
따라서 grep은 6 개 이상의 문자가있는 행만 출력하고 다른 문자는 grep에 의해 출력되지 않으므로 결과 파일로 만들지 않습니다.
답변
해결 방법 # 1 : C 사용
가장 빠른 방법 :이 C 프로그램을 컴파일하고 실행하십시오.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BUFFER_SIZE 1000000
int main(int argc, char *argv[]) {
int length;
if(argc == 3)
length = atoi(argv[2]);
else
return 1;
FILE *file = fopen(argv[1], "r");
if(file != NULL) {
char line[MAX_BUFFER_SIZE];
while(fgets(line, sizeof line, file) != NULL) {
char *pos;
if((pos = strchr(line, '\n')) != NULL)
*pos = '\0';
if(strlen(line) >= length)
printf("%s\n", line);
}
fclose(file);
}
else {
perror(argv[1]);
return 1;
}
return 0;
}
로 컴파일하고 gcc program.c -o program
실행하십시오 ./program file line_length
(여기서 file
= 파일 경로 및 line_length
= 최소 줄 길이 6
; 최대 줄 길이는 1000000
줄 당 문자 로 제한됩니다 MAX_BUFFER_SIZE
. 값을 변경하여이를 변경할 수 있습니다 ).
(대신에 속임수 \n
로 \0
발견 여기에 .)
쉘 솔루션을 제외하고이 질문에 제안 된 다른 모든 솔루션과 비교 (테스트는 평균 길이가 8자인 10M 줄의 ~ 91MB 파일에서 실행) :
time ./foo file 6
real 0m1.592s
user 0m0.712s
sys 0m0.160s
time grep ...... file
real 0m1.945s
user 0m0.912s
sys 0m0.176s
time grep -E '^.{6,}$'
real 0m2.178s
user 0m1.124s
sys 0m0.152s
time awk 'length>=6' file
real 0m2.261s
user 0m1.228s
sys 0m0.160s
time perl -lne 'length>=6&&print' file
real 0m4.252s
user 0m3.220s
sys 0m0.164s
sed -r '/^.{,5}$/d' file >out
real 0m7.947s
user 0m7.064s
sys 0m0.120s
./script.py >out
real 0m8.154s
user 0m7.184s
sys 0m0.164s
해결 방법 # 2 : AWK 사용 :
awk 'length>=6' file
length>=6
:length>=6
TRUE를 반환하면 현재 레코드를 인쇄합니다.
솔루션 # 3 : Perl 사용 :
perl -lne 'length>=6&&print' file
- 경우
lenght>=6
반환 TRUE, 현재 레코드를 인쇄합니다.
% cat file
a
bb
ccc
dddd
eeeee
ffffff
ggggggg
% ./foo file 6
ffffff
ggggggg
% awk 'length>=6' file
ffffff
ggggggg
% perl -lne 'length>=6&&print' file
ffffff
ggggggg
답변
Ex 모드에서 Vim을 사용할 수 있습니다 :
ex -sc 'v/\v.{6}/d' -cx file
-
\v
마술을 켜다 -
.{6}
6 자 이상의 줄을 찾으십시오 -
v
반전 선택 -
d
지우다 -
x
저장하고 닫습니다
답변
루비 솔루션 :
$ cat input.txt
abcdef
abc
abcdefghijk
$ ruby -ne 'puts $_ if $_.chomp.length() >= 6 ' < input.txt
abcdef
abcdefghijk
간단한 아이디어 : 루비의 stdin으로 파일을 리디렉션하고 길이가 6 이상인 경우에만 stdin에서 줄을 인쇄하십시오.