내 폴더에 .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}'