입력:
1
hgh
h2b
h4h
2
ok
koko
lkopk
3
uh
ju
nfjvn
4
예상 출력 :
1
2
3
4
따라서 출력 파일에 파일의 1, 5, 9, 13 값만 있으면됩니다. 이것을하는 방법?
입력:
1
hgh
h2b
h4h
2
ok
koko
lkopk
3
uh
ju
nfjvn
4
예상 출력 :
1
2
3
4
따라서 출력 파일에 파일의 1, 5, 9, 13 값만 있으면됩니다. 이것을하는 방법?
답변:
AWK 사용 :
awk '!((NR - 1) % 4)' input > output
이것이 어떻게 작동하는지 알아내는 것은 독자의 연습으로 남겨 둡니다.
NR % 4 == 1
더 읽기 쉬운 IMO가 될 것입니다.
사용 split
(GNU의로 coreutils) :
split -nr/1/4 input > output
-n
CHUNKS
출력 파일 생성와 CHUNKS
같은
r/K/N
라인 / 레코드를 분할하지 않고 라운드 로빈 분배를 사용하고 출력 Kth of N 만 stdout재미를위한 파이썬 버전 :
with open('input.txt') as f:
for i, line in enumerate(f.readlines()):
if i%4 == 0:
print(line.strip())
enumerate(f)
적은 메모리를 사용하면서 작업을 수행 할 수 있어야합니다
readlines
(따라서 전체 파일을 메모리로 슬러 핑) 사용하려고한다면 , f.readlines()[::4]
네 번째 줄마다 사용할 수 있습니다 . 사용할 수 있습니다 print(''.join(f.readlines()[::4]))
.
POSIX sed
:이 방법은 posixly sed를 사용하므로 모든 곳에서 실행하거나 posix를 존중하는 sed를 거의 사용할 수 있습니다.
$ sed -ne '
/\n/!{
H;s/.*//;x
}
:loop
$bdone
N;s/\n/&/4
tdone
bloop
:done
s/.//;P
' input.file
다른 하나는 확장 성 목적을위한 프로그래밍 방식의 sed 코드 생성입니다.
$ code=$(yes n | head -n 4 | paste -sd\; | sed s/n/p/)
$ sed -ne "$code" input.file
Perl
: 크기가 4가 될 때까지 배열 A를 채 웁니다. 그런 다음 첫 번째 요소를 인쇄하고 배열을 지 웁니다.
$ perl -pe '
$A[@A] = @A ? <> : $_ while @A < 4;
$_ = (splice @A)[0];
' input.file
로 전화하십시오 scriptname filename skip
(귀하의 경우 4) iter
파일의 상단에서 줄을 가져 와서 마지막으로 만 출력하여 작동합니다. 다음 단위 iter
별로 skips
의 값으로만큼 반복된다 iter
을 초과하지 않는 lines
로 file
.
#!/bin/bash
file="$1"
lines=`wc -l < "$file"`
skips="$2" || "4"
iter=1
while [ "$iter" -le "$lines" ]; do
head "$file" -n $iter | tail -n 1
iter=$(( $iter + $skips ))
done
순수한 배쉬 :
mapfile -t lines < input
for (( i=0; i < ${#lines[@]}; i+=4 ))
do printf "%s\n" "${lines[$i]}"
done
mapfile 은 Bash 4에 추가 된 기본 제공 lines
항목으로, 항목 당 한 줄로 표준 입력을 여기에 명명 된 배열로 읽습니다 . 이 -t
옵션은 최종 개행을 제거합니다.
네 번째 줄부터 네 번째 줄을 모두 인쇄하려면 mapfile
의 콜백 옵션을 사용하여 하나의 명령으로 인쇄 할 수 있습니다.이 옵션 -C
은 간격이 지정된 여러 줄마다 제공된 코드를 실행합니다 -c
. 현재 배열 인덱스와 다음에 할당 될 행이 코드에 인수로 제공됩니다.
mapfile -t -c4 -C 'printf "%.0s%s\n"' < input
이것은 printf
내장을 사용합니다 . 형식 코드 %.0s
는 첫 번째 인수 (인덱스)를 억제하므로 행만 인쇄됩니다.
동일한 명령을 사용하여 줄 1, 2 또는 3에서 시작하여 모든 네 번째 줄을 인쇄 할 수는 있지만 input
공급 하기 전에 3, 2 또는 1 줄을 앞에 mapfile
추가해야합니다. .
이것은 또한 작동합니다 :
mapfile -t lines < input
printf "%s%.0s%.0s%.0s\n" "${lines[@]}"
여기서는 한 번에 printf
네 개의 항목을 소비 lines
하며 첫 번째 항목 만 인쇄하고 다른 세 항목은으로 건너 뜁니다 %.0s
. 다른 간격이나 시작 지점에 대해 형식 문자열로 수동으로 바이올린을 조정해야하기 때문에 이것을 좋아하지 않습니다.
sed -n '1~4p'