Tôi muốn in các dòng số lẻ và số chẵn từ các tệp.
Tôi tìm thấy kịch bản shell này sử dụng tiếng vang.
#!/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"
Nhưng không có cách nào để làm điều đó trong một dòng?
Vâng, sử dụng awk, tôi đọc.
Các dòng số chẵn:
awk 'NR % 2' filename
các dòng số lẻ:
awk 'NR % 2 == 1' filename
Nhưng nó không làm việc cho tôi. Cả hai sản xuất cùng một đầu ra, theo diff. Khi so sánh với tệp gốc, cả hai đều thực sự dài bằng một nửa và cả hai đều chứa các dòng số lẻ. Tôi có làm điều gì sai?
NR % 2 == 0
, nếu không nó tương đương với cái thứ hai.