
파일의 홀수 줄과 짝수 줄을 인쇄하고 싶습니다.
echo를 사용하여 이 쉘 스크립트를 찾았습니다.
#!/bin/bash
# Write a shell script that, given a file name as the argument will write
# the even numbered line to a file with name evenfile and odd numbered lines
# in a text file called oddfile.
# -------------------------------------------------------------------------
# Copyright (c) 2001 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------
file=$1
counter=0
eout="evenfile.$$" # even file name
oout="oddfile.$$" # odd file name
if [ $# -eq 0 ]
then
echo "$(basename $0) file"
exit 1
fi
if [ ! -f $file ]
then
echo "$file not a file"
exit 2
fi
while read line
do
# find out odd or even line number
isEvenNo=$( expr $counter % 2 )
if [ $isEvenNo -ne 0 ]
then
# even match
echo $line >> $eout
else
# odd match
echo $line >> $oout
fi
# increase counter by 1
(( counter ++ ))
done < $file
echo "Even file - $eout"
echo "Odd file - $oout"
그런데 한 줄로 할 수 있는 방법이 없을까요?
예, awk를 사용하면나는 읽었다.
짝수 행:
awk 'NR % 2' filename
홀수 행:
awk 'NR % 2 == 1' filename
그러나 이것은 나에게 효과가 없습니다. diff에 따르면 둘 다 동일한 출력을 생성합니다. 실제로 원본 파일에 비해 길이가 절반이고 둘 다 홀수 줄을 포함합니다. 내가 뭐 잘못 했어요?
답변1
나는 가능한 한 POSIX 규격을 선호하므로 이 대안을 게시해야겠다고 생각했습니다. 나는 종종 xargs
텍스트를 나누기 위해 파이핑하기 전에 이를 사용합니다.
짝수 라인을 인쇄하고,
sed -n 'n;p'
이상한 줄을 인쇄하고,
sed -n 'p;n'
정기적으로 사용하는 동안 awk
이러한 유형의 작업에는 약간 과잉입니다.
답변2
짝수의 경우 코드는 다음과 같아야 합니다.
awk 'NR%2==0' filename
& 홀수의 경우
awk 'NR%2==1' filename
답변3
그것은 간단합니다:
sed -n 2~2p filename
파일 이름에 짝수 줄을 인쇄합니다
sed -n 1~2p filename
이상한 줄이 인쇄됩니다.
답변4
한 번의 호출로 이 작업을 수행 할 수 있으며 sed
파일을 두 번 읽을 필요가 없습니다.
sed '$!n
w even
d' infile > odd
또는 한 줄을 선호하는 경우:
sed -e '$!n' -e 'w even' -e d infile > odd
파일에 한 줄만 포함되어 있으면 예상한 결과가 제공되지 않습니다( 첫 번째 줄이 실행되지 않아서 가 아니라 해당 줄이 w
기록 됩니다 ). 이를 방지하려면 조건을 추가하세요.even
odd
n
sed -e '$!n' -e '1!{w even' -e 'd}' infile > odd
어떻게 작동하나요? 음, 세 가지 명령을 사용합니다 sed
:
n
- 마지막 줄에 있지 않은 경우인쇄패턴 공간 stdout
( file 로 리디렉션됨 odd
)을 다음 줄로 바꾸고(이제 짝수 줄을 처리하고 있음) 나머지 명령 실행을 계속합니다.
w
- 패턴 공간을 파일에 추가합니다. even
d
- 현재 패턴 공간을 삭제하고 루프를 다시 시작합니다. - 부작용 이는 sed
스크립트 끝에 도달하지 않기 때문에 패턴 공간을 자동으로 인쇄하지 않습니다.
즉, n
홀수 행에서만 실행되고, w
짝수 d
행에서만 실행됩니다. sed
앞서 말했듯이 입력이 한 줄로 구성되지 않는 한 자동으로 인쇄되지 않습니다.