![유틸리티를 사용하여 텍스트 파일의 한 줄당 탭 수 계산](https://linux55.com/image/3902/%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%ED%95%9C%20%EC%A4%84%EB%8B%B9%20%ED%83%AD%20%EC%88%98%20%EA%B3%84%EC%82%B0.png)
탭 목록 파일이 있습니다. 각 행의 탭 수가 동일한지 확인하고 싶습니다.
첫 번째 단계로 행당 탭 수를 인쇄하고 싶습니다.
나는 그것을 시도했지만 grep -o '\t' infile | wc -l
내 구현은 grep
다음과 같습니다 grep: invalid option -- o
. 다른 방법이 있나요?
있으면 좋은 점: 가능하다면 개인적 선호로 인해 이 작업을 수행하려면 util(grep, cat 등) 도구를 사용하는 것이 좋습니다.아니요 awk
또는 bash 스크립트.
답변1
sed
etc는 이에 적합하지 않다고 생각합니다 . 간단한 방법은 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 를 사용하는 이유 입니다 .awk
awk
NF-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
그가 쫓던 것이 정확히 무엇이었는가.