只显示猫的奇数行


28

嗨,

大概这很容易,但是我现在不明白这一点。在Linux中,shell在给定文本文件的情况下如何执行cat文件名之类的操作,因此我仅看到第一行,第三行,5、7、9等?

如果不使用cat,则使用另一个命令

谢谢

bash 

Answers:


41

使用awkawk 'NR % 2 == 0' filename

编辑:删除{print},如ghostdog74的答案所示,并由Roberto Bonvallet评论。


1
{print}是默认操作,awk 'NR % 2 == 0' < myfile就足够了。

3
@roberto,不需要输入重定向。
user31894 '01

1
只需注意,这将显示偶数行(第一行为1)和奇数行(如果您认为第一行为0)。更换2 == 02 == 1的正好相反。
cde 2013年

13

或类似的东西

sed -n 'p;n' filename

为了进行解释,请查找的手册页sed


这是sed我想念的便携式版本。
克里斯·约翰森

1
您可以轻松地sed -n '1d;p;n'
先行

7

使用sed:

sed -n 1~2p filename

1
这是一个GNU扩展。它可能不适用于sed不是默认GNU的系统。
克里斯·约翰森

的确如此,但应该适用于大多数Linux版本

嗯..我刚刚尝试了“ sed --posix -n 1〜2p文件名”,这似乎也能正常工作。--posix应该删除对gnu扩展的支持。

GNU sed手册gnu.org/software/sed/manual/html_node/Addresses.html#Addresses说“第一步〜这个GNU扩展…”。它没有提及--posix。当我尝试gsed --posix -n 1~2p(GNU sed 4.2.1)时,我得到了gsed: -e expression #1, char 2: unknown command: ‘~’
克里斯·约翰森

好吧。不知道我的sed有什么问题。我正在使用cygwin,所以可能与它有关。


2

用awk实现的两种方法

$ awk '{getline;print}' file # the equivalent of the selected sed answer
$ awk 'NR%2==0' file

或者只用外壳

i=1; while read -r line; do [ $((i++ % 2)) -eq 0 ] && echo $line; done <"file"


0

尚未对此进行测试(在Mac OS X上似乎不起作用),但是GNU sed支持first~step作为地址选择,因此例如:

sed -n 1~2p file

从第一行开始,然后每隔一行打印一次。


是的,这是GNU扩展。Mac OS X sed在基本安装中使用BSD 。
克里斯·约翰森


-2

您可以使用这些命令来获得结果

awk'NR%2 == 1'

sed -ne'1〜2p'


2
-1。这个重复了将近10年前的答案,根本没有解释微小的差异。为什么在ls -l这里?
卡米尔Maciorowski
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.