sed/awk를 사용하여 각 줄의 첫 번째 "공백이 아닌 표시" 검색

sed/awk를 사용하여 각 줄의 첫 번째 "공백이 아닌 표시" 검색

큰 파일이 있습니다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 '

관련 정보