打印奇数行,打印偶数行

ixt*_*lix 25 sed awk text-processing

我想打印文件中的奇数行和偶数行。

我找到了这个使用 echo 的 shell 脚本。

#!/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"
Run Code Online (Sandbox Code Playgroud)

但是没有办法在一行中完成吗?

是的,使用awk,我读过。

偶数行:

awk 'NR % 2' filename
Run Code Online (Sandbox Code Playgroud)

奇数行:

awk 'NR % 2 == 1' filename
Run Code Online (Sandbox Code Playgroud)

但这对我不起作用。根据 diff,两者都产生相同的输出。与原始文件相比,它们的长度确实是原来的一半,并且都包含奇数行。难道我做错了什么?

J. *_*ker 37

我更喜欢尽可能与 POSIX 兼容,所以我想我会发布这个替代方法。在xargs管道之前,我经常使用这些来处理文本。

打印偶数行,

sed -n 'n;p'
Run Code Online (Sandbox Code Playgroud)

打印奇数行,

sed -n 'p;n'
Run Code Online (Sandbox Code Playgroud)

虽然我经常使用awk,但对于这种类型的任务来说太过分了。

  • 这是一个解释/sf/ask/3613047161/#:~:text=sed%20%2Dn%20'p%3Bn',-% 2Dn%20抑制%20all&amp;text=p%20打印%20%20当前%20行,再次%20在%20此%20新%20行上。 (3认同)

neu*_*n34 14

这很容易:

 sed -n 2~2p filename
Run Code Online (Sandbox Code Playgroud)

将从文件名打印偶数行

sed -n 1~2p filename
Run Code Online (Sandbox Code Playgroud)

将打印奇数行。

  • @jw013:`awk` 没什么问题,我个人经常使用它。我从来没有说过任何关于“awk”的“非 POSIX”,我指的是答案的“sed”选项。特别是 `~` 操作符,它是一个 GNU 扩展,对于很多人来说仍然是可以接受的。关于“额外使用 AWK”,我个人认为将“awk”用于这个简单的任务是过度的。所以 +1 是为了用 `sed` 完成任务,这是一个比 `awk` 更轻量的工具。 (3认同)
  • 有人可以解释 ~ 运算符在这里是如何工作的吗? (2认同)

Nee*_*eel 13

对于偶数,代码应该是

awk 'NR%2==0' filename
Run Code Online (Sandbox Code Playgroud)

& 对于奇数

awk 'NR%2==1' filename
Run Code Online (Sandbox Code Playgroud)


man*_*ork 12

正如您“在一行中”所问:

awk '{print>sprintf("%sfile.%d",NR%2?"odd":"even",PROCINFO["pid"])}' filename
Run Code Online (Sandbox Code Playgroud)

请注意,大部分代码是由于您选择了花哨的输出文件名。否则,以下代码足以将奇数行放在“line-1”中,将偶数行放在“line-0”中:

awk '{print>"line-"NR%2}' filename
Run Code Online (Sandbox Code Playgroud)