홀수 줄 인쇄, 짝수 줄 인쇄

홀수 줄 인쇄, 짝수 줄 인쇄

파일의 홀수 줄과 짝수 줄을 인쇄하고 싶습니다.

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기록 됩니다 ). 이를 방지하려면 조건을 추가하세요.evenoddn

sed -e '$!n' -e '1!{w even' -e 'd}' infile > odd

어떻게 작동하나요? 음, 세 가지 명령을 사용합니다 sed:
n- 마지막 줄에 있지 않은 경우인쇄패턴 공간 stdout( file 로 리디렉션됨 odd)을 다음 줄로 바꾸고(이제 짝수 줄을 처리하고 있음) 나머지 명령 실행을 계속합니다.
w- 패턴 공간을 파일에 추가합니다. even
d- 현재 패턴 공간을 삭제하고 루프를 다시 시작합니다. - 부작용 이는 sed스크립트 끝에 도달하지 않기 때문에 패턴 공간을 자동으로 인쇄하지 않습니다.

즉, n홀수 행에서만 실행되고, w짝수 d행에서만 실행됩니다. sed앞서 말했듯이 입력이 한 줄로 구성되지 않는 한 자동으로 인쇄되지 않습니다.

관련 정보