奇数行印刷、偶数行印刷

奇数行印刷、偶数行印刷

ファイルの奇数行と偶数行を印刷したいです。

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

1回の呼び出しでこれを行うことができ、ファイルをsed2回読む必要はありません。

sed '$!n
w even
d' infile > odd

または1行を好む場合:

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

ファイルに1行しか含まれていない場合、期待される結果は得られません(最初の行が実行されていないためではなく、その行が記録されますw)。これを防ぐには、条件を追加してください。evenoddn

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

どのように動作しますか?さて、3つのコマンドを使用しますsed
n- 最後の行にない場合印刷パターンスペースstdout(ファイルにリダイレクトされているodd)を次の行に置き換えて(もう偶数行を処理しています)、残りのコマンドの実行を続けます。
w- パターンスペースをファイルに追加します。even
d- 現在のパターン空間を削除し、ループを再開します。 - 副作用 これはsedスクリプトの終わりに達しないため、パターン空間を自動的に印刷しません。

つまり、n奇数行でのみ実行され、w偶数d行でのみ実行されます。sed前述したように、入力が1行で構成されていない限り、自動的に印刷されません。

関連情報