인쇄 줄 앞에 파일 이름 인쇄

인쇄 줄 앞에 파일 이름 인쇄

파일의 특정 행 범위를 인쇄하려면 다음 bash 함수를 사용하고 있습니다.

print-lines ()
  {
    na=$1
    nb=$2
    dir=$3

    find "$dir" \( -name \*.org -o -name \*.texi \)  \
      -exec awk -v a="$na" -v b="$nb"                \
             'FNR >= a && FNR <= b {print}' {} +
  }

이런 파일이 2개 있어요

foo:
a
b
c
d
e 

bar:
1
2
3
4
5

명령을 print-lines 2 4. 내가 원하는 결과는

==> foo <==

b
c
d

==> bar <==

2
3
4

답변1

파일에 최소한 한 줄이 있는 경우에만 $na파일 이름을 인쇄해야 하는 경우:

find . -name '*.csv' -exec awk -v a="$na" -v b="$nb" '
    FNR == a {print "==>", FILENAME, "<=="}
    a <= FNR && FNR <= b
' {} +

내용에 관계없이 각 파일의 파일 이름을 인쇄하려는 경우 GNU awk가 편리할 수 있습니다.

find . -name '*.csv' -exec gawk -v a="$na" -v b="$nb" '
    BEGINFILE {print "==>", FILENAME, "<=="}
    a <= FNR && FNR <= b
' {} +

답변2

head제목을 좋아하고 인쇄하면 tail그 중 한 명에게 인쇄를 요청할 수 있습니다. A에서 B까지의 행을 가져오려면(1부터 계산) 먼저 tailA행에서 시작하도록 지시한 +A다음( ) Head에 첫 번째 행 B-A+1을 유지하고 1행을 머리글 행으로 유지하라고 지시합니다.

tail -n "+$na" -v -- "$filename" | head -n $((nb - na + 2))

head각 파일 뒤에 빈 줄이 있는 find에서 호출됩니다( or 와 거의 동일합니다 tail. 여기 코드는 끝에 빈 줄을 추가합니다).

find … -exec sh -c 'tail -n "+$1" -v -- "$0" | head -n $(($2 - $1 + 2)); echo' {} "$1" "$2" \;

답변3

findby 문이 인쇄를 수행하도록 할 수 있습니다 printf. in은 -exec +더 이상 가능하지 않으며, 사례별 호출을 사용해야 합니다 awk.

print-lines () {
    na=$1
    nb=$2
    dir=$3

    find "$dir" \( -name \*.org -o -name \*.texi \)  \
    -printf '==> %p <==\n\n' \
    -exec awk -v a="$na" -v b="$nb" 'FNR >= a && FNR <= b' '{}' \; \
    -printf '\n'    
  }

솔루션을 사용하는 것보다 성능이 약간 저하될 수 있습니다 awk.

답변4

사용GNU sed-s 옵션을 사용하여 여러 파일을 sed에 공급하고 개별적으로 처리합니다.

find "$dir" -type f \
  \( -name "*.texi" -o -name "*.org" \) \
  -exec sed -sne "
    ${na}{x;s/.*/==>/p;F;s//<==/p;x;}
    $na,${nb}p
" {} +;

Python은 계층 구조를 탐색하기 위해 pathlib 모듈을 결합하고 파일을 조각화하기 위해 itertools를 결합합니다.

python3 -c 'import pathlib, itertools, sys
na,nb,dir = sys.argv[1:]
p = pathlib.Path(dir)
for q in p.glob("**/*"):
  if q.suffix in [".texi",".org"] and q.is_file():
    with open(q.name) as f:
      L = [l.rstrip("\n") for l in itertools.islice(f, int(na)-1, int(nb))]
    if len(L) > 0:
      print("==>",q.name,"<==")
      print(*L,sep="\n")
' 2 4 .

관련 정보