큰 파일이 있습니다N-트리플/N-쿼드
독특한 주제를 남기고 싶습니다.
더 작은 파일의 경우 다음을 사용하여 이를 달성할 수 있습니다.
awk '{print $1}' | uniq
그러나 대용량 파일awk
에는 실패합니다 . 철사. (몇 MB).
sed
// etc'...와 grep -o
유사한 것을 어떻게 구현할 수 있습니까 ?
편집하다:
awk는 다음과 같이 실패합니다.
awk: program limit exceeded: maximum number of fields size=32767
FILENAME="file.nq" FNR=308254 NR=308254
답변1
[업데이트] 일부 행에 공백으로 구분된 필드가 너무 많습니다. grep
대신 시도해 보세요 awk
:
grep -E -o '^[^[:space:]]+' your_input_file | uniq
sed
매우 큰 파일의 각 줄에 많은 추가 작업을 수행하므로(줄 끝을 제거하기 위해) 사용하지 않는 것이 좋습니다 . 동일 awk
: 라인 구문 분석이 필요하지 않습니다.
답변2
그리고 sed
:
sed 's/^ *\([^ ]*\) .*$/\1/g' | uniq
이렇게 하면 각 줄이 공백이 아닌 첫 번째 시퀀스로 대체됩니다.
두 개의 s를 사용하는 더 빠른 변형 grep
(AWK처럼 선행 공백이 있는 줄을 처리함):
grep -o "^[[:space:]]*[^[:space:]]*" | grep -o "[^[:space:]]*" | uniq
답변3
편집된 질문에 답하려면 를 사용하세요 long lines
.
이 상황에 사용할 수 있는 한 가지 방법은 tr
공백과 개행 문자를 바꾸는 것입니다. 첫 번째 행에서 첫 번째 레코드를 가져오는 방법에는 여러 가지가 있습니다. 그러면 문제는 공백이 포함된 줄을 찾는 것입니다.
{ echo # output a newline to get the first record
cat file
} | tr ' \n' '\n ' |
sed -n '/ /s/.* //p'
또는
tr ' \n' '\n ' < file | sed -ne '1p' -e '/ /s/.* //p'
아이디어는 당신이 변화한다는 것입니다
this is a long line
and this is another
도착하다
this
is
a
long
line and
this
is
another
따라서 줄 길이 제한이 있는 도구에는 문제가 없습니다. 필드 사이에 탭이 있으면 다음을 원할 수 있습니다.tr ' \t\n' '\n\n '