특정 파일 형식 내에서 패턴 사이의 줄 수 찾기

특정 파일 형식 내에서 패턴 사이의 줄 수 찾기

notes.json각 디렉토리에 파일이 있습니다 . 다음 명령은 notes.json각 파일의 길이를 계산하고 각 파일의 줄 수를 기준으로 정렬된 출력을 반환합니다.

find . -name notes.json | xargs wc -l | sort -nr

그것은 돌아온다

789 ./D/notes.json
789 ./F/notes.json
574 ./A/notes.json
519 ./G/notes.json

이제 나는검색 모드내부 내용에 대해 각 파일에 대해 정렬된 줄 수를 notes.json반환하려고 합니다 .notes.json

나는 노력했다 find . -name notes.json | xargs cat | jq '."text1[]"' | wc -l. 그러나 text1[ ]All 사이의 총 행 수인 하나의 값만 받습니다 notes.json. 물론, cat모든 파일에 대한 패턴 매칭이 함께 출력되기 때문이다. notes.json각 파일의 행 길이(일치 패턴에서 반환됨)를 정렬하여 출력하는 방법이 있습니까 ?

답변1

  • 정렬되지 않음산출:

수천 개의 json 파일이 포함된 내 파일 트리에서 다음을 시도해 보세요.

$ find . -type f -name "*[0-9].json" \
    -exec bash -c 'printf "%4d %s\n" $(jq ".bbx_basic[]" "$1" | wc -l) "$1"' bashscript {} ';'
[Example output in my tests]
 130 ./Images/Training_set/00000845.json
  13 ./Images/Training_set/00005869.json
  13 ./Images/Training_set/00000991.json
  26 ./Images/Training_set/00005631.json
1013 ./Images/Training_set/00001737.json
...
 410 ./Annot_txt/Coco_en_2017/instances_val2017.json
   0 ./Annot_txt/Coco_en_2017/instances_val2017.json

이렇게 하면 검색이 일반 파일로 제한되어 내 패턴에 지정된 파일 이름을 찾습니다 *[0-9].json. 귀하의 경우에는 다음 명령을 실행해야 합니다:

 $ find . -type f -name "notes.json" \
     -exec bash -c 'printf "%6d %s\n" $(jq ".text1[]" "$1" | wc -l) "$1"' bashscript {} ';'
  • 종류산출:
    • outfile수정된 명령은 정렬하고 표준 출력으로 보내는 것보다 더 많은 작업을 수행하려는 경우를 대비하여 정렬되지 않은 출력을 중간 임시 파일(이름)에 저장합니다 . /tmp/필요한 경우 디렉터리에서 파일을 찾을 수 있습니다.
    • 역정렬은 첫 번째(숫자) 필드에서 수행되므로 지정된 로케일에 종속되어서는 안 됩니다.
    • find종료 상태에 관계없이 백그라운드 실행 작업이 종료되면 정렬이 시작됩니다.

암호:

$ find . -type f -name "notes.json" \
    -exec bash -c 'printf "%6d %s\n" $(jq ".text1[]" "$1" | wc -l) "$1" 2>/dev/null >> outfile' bashscript {} ';'; sort -k1,1nr outfile

위의 내용은 다음을 통해 동시에 더욱 강력하고 유연하게 만들 수 있습니다.

$ find . -type f -name "notes.json" -exec sh -c '
    for file do
      printf "%6d %s\n" $(jq ".text1[]" "$file" 2>/dev/null | wc -l) "$file"
    done' sh {} + >> outfile; sort -k1,1nr outfile

결과는 동일하지만 @StéphaneChazelas의 제안에 따른 개선 사항은 다음과 같습니다.

  • sh휴대성을 높이기보다는 사용함으로써 bash,
  • 결과를 파일별로 처리 find ...-exec sh -c '...'( )하는 대신 일괄 처리( )로 생성되는 쉘 수를 최소화합니다 .+\;find
  • outputfind이전처럼 파일별로 리디렉션하는 대신 전체 출력을 리디렉션하여 열려 있는 파일 설명자( ) 수를 최소화합니다 .

답변2

왜 필요한지에 대한 논리적 추론이 있습니까? 개행 문자가 필요하지 않기 때문에 한 줄에 많은 수의 레코드를 쓸 수 있습니다. 차라리 당신이 상대할 무기를 잘못 선택했다고 말하고 싶습니다.JSON. 그러므로 나는 다음을 사용하는 것이 좋습니다.PHP 명령줄 인터페이스,예를 들어. JSON 배열의 항목 수를 계산합니다. 기본적으로 현재 버전에는 JSON 파일 형식용 드라이버가 함께 제공됩니다. 사용할 PHP 함수는 다음과 같습니다.get_file_contents(),json_decode()그리고sizeof().

답변3

안타깝게도 이 요청에 대해서는 한 문장도 쓸 수 없습니다. 다음 스크립트는 문제를 해결합니다.

#!/bin/bash
declare -a arr
arr=()
for i in $(find . -name notes.json)
do
  arr+=`(echo $i | xargs cat | jq '.text1[]'  | wc -l); echo $i; echo "\n"`
done
echo -e $arr | sort -nr > out.txt

관련 정보