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
,但对于这种类型的任务来说太过分了。
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)
将打印奇数行。
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)