Program Tip

unix-파일의 열 수

programtip 2020. 11. 13. 23:58
반응형

unix-파일의 열 수


이와 같은 데이터가있는 파일 (예 : stores.dat 파일)이 주어집니다.

sid|storeNo|latitude|longitude
2|1|-28.03720000|153.42921670
9|2|-33.85090000|151.03274200

열 이름 수를 출력하는 명령은 무엇입니까?

즉, 위의 예에서는 4입니다 (파이프 문자 수 + 첫 번째 줄에 1).

나는 다음과 같이 생각하고 있었다.

awk '{ FS = "|" } ; { print NF}' stores.dat

그러나 첫 번째 줄 대신 모든 줄을 반환하고 첫 번째 줄의 경우 4 대신 1을 반환합니다.


awk -F'|' '{print NF; exit}' stores.dat 

첫 번째 줄 바로 다음에 종료하십시오.


이것은 해결 방법입니다 (저는 awk를 자주 사용하지 않습니다).

데이터가 포함 된 파일의 첫 번째 행을 표시하고 모든 파이프를 개행 문자로 바꾼 다음 행을 계산합니다.

$ head -1 stores.dat | tr '|' '\n' | wc -l

공백을 사용하지 않는 한 | wc -w첫 번째 줄 에서 사용할 수 있어야합니다 .

wc"단어 수"는 단순히 입력 파일의 단어 수를 계산합니다. 한 줄만 보내면 열 수를 알려줍니다.


당신은 시도 할 수 있습니다

고양이 파일 | awk '{print NF}'


파이썬이 설치되어 있다면 다음을 시도해 볼 수 있습니다.

python -c 'import sys;f=open(sys.argv[1]);print len(f.readline().split("|"))' \
    stores.dat

이것은 일반적으로 필드 수를 계산하는 데 사용하는 것입니다.

head -n 1 file.name | awk -F'|' '{print NF; exit}'

Mat의 awk 솔루션과 유사한 Perl 솔루션 :

perl -F'\|' -lane 'print $#F+1; exit' stores.dat

1000000 열이있는 파일에서 이것을 테스트했습니다.


필드 구분자가 파이프 대신 공백 (하나 이상의 공백 또는 탭) 인 경우 :

perl -lane 'print $#F+1; exit' stores.dat

Cat Kerr 응답을 기반으로합니다. 이 명령은 solaris에서 작동합니다.

awk '{print NF; exit}' stores.dat

시도해 볼 수 있습니다.

head -1 stores.dat | grep -o \|  | wc -l

파일의 행 (아래 예에서는 두 번째 행)을 선택하고 열 수를 계산합니다. 여기서 구분 기호는 공백입니다.

sed -n 2p text_file.dat | tr ' ' '\n' | wc -l

적절한 순수 방법

bash에서는 간단하게 다음을 수행 할 수 있습니다.

IFS=\| read -ra headline <stores.dat
echo ${#headline[@]}
4

포크없는 것 보다 훨씬 빠르며 $headline전체 헤드 라인 유지하는 것처럼 재사용이 가능 합니다. 샘플을 위해 다음을 수행 할 수 있습니다.

printf " - %s\n" "${headline[@]}"
 - sid
 - storeNo
 - latitude
 - longitude

참고이 구문은 열 이름에서 공백과 기타 문자를 올바르게 구동합니다.

대안 : 각 행의 최대 열에 대한 강력한 이진 검사

일부 행에 추가 열이 있으면 어떻게됩니까?

이 명령은 구분 기호를 계산하여 더 큰 줄을 검색합니다 .

tr -dc $'\n|' <stores.dat |wc -L
3

최대 3 개의 구분 기호와 4 개의 필드가 있습니다.

참고 URL : https://stackoverflow.com/questions/8629330/unix-count-of-columns-in-file

반응형