파일의 특정 행 범위를 인쇄하려면 다음 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부터 계산) 먼저 tail
A행에서 시작하도록 지시한 +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
find
by 문이 인쇄를 수행하도록 할 수 있습니다 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 .