유틸리티를 사용하여 텍스트 파일의 한 줄당 탭 수 계산

유틸리티를 사용하여 텍스트 파일의 한 줄당 탭 수 계산

탭 목록 파일이 있습니다. 각 행의 탭 수가 동일한지 확인하고 싶습니다.

첫 번째 단계로 행당 탭 수를 인쇄하고 싶습니다.

나는 그것을 시도했지만 grep -o '\t' infile | wc -l내 구현은 grep다음과 같습니다 grep: invalid option -- o. 다른 방법이 있나요?


있으면 좋은 점: 가능하다면 개인적 선호로 인해 이 작업을 수행하려면 util(grep, cat 등) 도구를 사용하는 것이 좋습니다.아니요 awk또는 bash 스크립트.

답변1

sedetc는 이에 적합하지 않다고 생각합니다 . 간단한 방법은 awk탭을 필드 구분자로 사용하여 호출하는 것입니다.

printf $'hello\tworld\thugo\nfoo\tbar\nbaz\n' | awk -F$'\t' '{print NF-1;}'

이것은 만든다

2
1
0

답변2

목표가 각 행에 항상 동일한 수의 탭이 있는지 감지하는 것이라면(bash도, awk도 없음):

sed 's/[^\t]//g' file | sort -u | wc -l

1이 출력된다면 대단한 것입니다!

또는 다음 sed으로 바꾸세요 tr.

tr -cd \\t\\n < file | sort -u | wc -l

또는 고양이를 쓸데없이 사용하는 것을 좋아하고 연결 옵션이 마음에 들지 않는 경우:

cat file | tr -c -d \\t\\n | sort -u | wc -l

비결은 각 줄에서 탭이 아닌 문자를 모두 제거한 다음 남은 내용을 정렬/통합하는 것입니다.

답변3

솔직히 가장 쉬운 방법은 다음을 사용하는 것입니다 awk.

awk -F'\t' '{print NF-1}' foo

NF는 필드 수이며 탭 수가 필드 수보다 하나 작아지도록 탭에서 필드를 분할 -F'\t'하도록 지시합니다 . 이것이 바로 우리가 print 를 사용하는 이유 입니다 .awkawkNF-1

정말로 사용하고 싶지 않다면 awk이렇게 해도 됩니다(노트:각 줄 끝의 후행 탭은 계산되지 않습니다.

$ while read line; do echo "$line" | fold -1 | grep -c $'\t'; done < foo
2
4
0
1
0

선행 및 후행 탭과 백슬래시와 같은 기타 이상한 문자를 처리하려면 대신 다음을 수행하십시오.

$ while IFS= read line; do echo "$line" | fold -1 | grep -c $'\t'; done < foo
  • while read lines; do ... ; done < foo: 파일의 각 줄을 foo변수로 읽어옵니다 $line.
  • echo "$line" | fold -1: 접기 명령은 한 줄에 한 문자를 인쇄합니다.
  • grep -c $'\t': $line파일( )의 각 라인에 대해 동작하지만, $line한 라인에 한 문자로 축소되므로 grep -c해당 라인의 탭 수가 계산됩니다. fold먼저 계산 하지 않으면 grep -c일치하는 줄의 개수만 계산되고 탭 개수가 제공되지 않습니다.모든철사.

물론 Perl을 사용할 수도 있지만 그것도 사용할 수 없는 것 같습니다. 어쨌든 한 가지 방법은 다음과 같습니다.

perl -lne '@a=/\t/g;print scalar @a' foo 

답변4

너무 늦게 깨달았지만 OP의 명령줄은 거의 정확했습니다. TAB 앞에 $('\t')만 있으면 됩니다.

grep -o $'\t' infile | wc -l

그가 쫓던 것이 정확히 무엇이었는가.

관련 정보