여러 gz 파일의 여러 파이프 기호에 대한 zgrep

여러 gz 파일의 여러 파이프 기호에 대한 zgrep

내 폴더에 .gz 파일이 많이 있습니다.

/a/b/c1.gz
/a/b/c2.gz
/a/b/c3.gz

등.

일부 파일에는 파이프 구분 기호가 하나 있고 일부 파일에는 다음과 같이 2개, 3개, 4개 등이 있습니다.

xyz|abc
xyz|abc|wty
xyz|abc|wty|asd

등.

두 개의 파이프 구분 기호, 세 개의 구분 기호 등이 있는 모든 파일을 찾는 방법은 무엇입니까?

답변1

|--구분된 열의 ​​개수가 특정 파일에서 일정하다고 가정하면 파일의 첫 번째 줄을 검사하는 것만으로도 해당 파일에 있는 열의 개수를 판단할 수 있습니다.

다음은 이름이 지정된 파일에 대해 이 작업을 수행합니다 name.gz.

gzip -dc name.gz | awk -F '|' -v name="name.gz" '{ print NF, name } { exit }'

따라서 간단한 루프를 사용하면 열 수와 파일 이름(예: 패턴과 일치하는 모든 파일)을 출력할 수 있습니다 /a/b/c*.gz.

for name in /a/b/c*.gz; do
    gzip -dc "$name" |
    awk -F '|' -v name="$name" '{ print NF, name } { exit }'
done

n=3특정 수의 열( 예:) 이 있는 파일 이름만 출력하려면 다음을 사용하십시오.

n=3
for name in /a/b/c*.gz; do
    gzip -dc "$name" |
    awk -F '|' -v n="$n" -v name="$name" 'NF == n { print name } { exit }'
done

답변2

세 가지 테스트 파일을 만들어 보겠습니다.

echo 'xyz|abc' > c1
echo 'xyz|abc|wty' > c2
echo 'xyz|abc|wty|asd' > c3
gzip c*

한 줄에 하나의 파이프를 포함하는 파일:

$ zgrep '^[^|]*|[^|]*$' *.gz
c1.gz:xyz|abc

다른 숫자(연속된 파이프 하나 포함)의 경우 다음 패턴을 사용할 수 있습니다.

두 개의 파이프가 늘어서 있습니다.

$ zgrep -E '^([^|]*\|){2}[^|]*$' *.gz
c2.gz:xyz|abc|wty

연속된 세 개의 파이프:

$ zgrep -E '^([^|]*\|){3}[^|]*$' *.gz
c3.gz:xyz|abc|wty|asd

연속된 2개 또는 3개의 파이프:

$ zgrep -E '^([^|]*\|){2,3}[^|]*$' *.gz
c2.gz:xyz|abc|wty
c3.gz:xyz|abc|wty|asd

최고. 연속된 세 개의 파이프:

$ zgrep -E '^([^|]*\|){,3}[^|]*$' *.gz
c1.gz:xyz|abc
c2.gz:xyz|abc|wty
c3.gz:xyz|abc|wty|asd

파일 이름만 필요한 경우 옵션을 추가하세요 -l.zgrep -lE ...


zgrep버전은 재귀 옵션을 지원하지 않습니다 -r.

find재귀 검색을 사용 하고 zgrep결과를 실행할 수 있습니다.

$ find . -type f -name '*.gz' -exec zgrep -lE '^([^|]*\|){3}[^|]*$' {} \;
./c3.gz

답변3

파일 이름을 awk로 파이프하고 각 파일에서 |-의 수를 찾을 수 있습니다. 예: echo 'A|B|C' |awk -F\| '{Print NF-1}'

관련 정보