catで奇数行のみを表示する


27

こんにちは、

おそらくこれは非常に簡単なことですが、私は今ポイントを得ることができません。Linuxでは、シェル、テキストファイルが与えられた場合、どのように猫のファイル名のようなことができますか?

猫を使用しない場合、別のコマンドを使用する

ありがとう

bash 

回答:


40

を使用してawkawk 'NR % 2 == 0' filename

編集:{print}ghostdog74の回答に示されているように削除され、Roberto Bonvalletによってコメントされました。


1
{print}デフォルトのアクションawk 'NR % 2 == 0' < myfileなので、十分です。

3
@roberto、入力のリダイレクトは必要ありません。
user31894

1
ちょうどメモとして、これは偶数行(最初の行が1である場合)と奇数行(最初の行を0と考える場合)を示します。交換する2 == 02 == 1、反対のために。
cde

13

または何かのような

sed -n 'p;n' filename

説明については、のmanページを参照してくださいsed


これはsed私の心を滑らせたポータブル版です。
クリスジョンセン

1
sed -n '1d;p;n'たとえば、偶数行の場合、前もって行を簡単にスキップできます
-kisp

7

sedを使用します。

sed -n 1~2p filename

1
これはGNU拡張機能です。GNU sedがデフォルトではないシステムでは動作しない場合があります。
クリスジョンセン

本当ですが、ほとんどの種類のLinuxで動作する

うーん.. "sed --posix -n 1〜2p filename"を試してみたところ、うまくいくようです。--posixは、gnu拡張機能のサポートを削除することになっています。

GNU sedマニュアルgnu.org/software/sed/manual/html_node/Addresses.html#Addressesには、「このGNU拡張機能の最初のステップ…」と書かれています。それは言及していません--posix。私がしようとするとgsed --posix -n 1~2p(GNUは4.2.1をSED)、私が得ますgsed: -e expression #1, char 2: unknown command: ‘~’
クリスジョンセン

わかりました。私のsedの何が悪いのか知らない。私はcygwinを使用しているので、それは何か関係があるかもしれません。


2

awkでできる2つの方法

$ 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

最初の行から開始し、その後1行おきに印刷します。


そう、これはGNU拡張機能です。Mac OS Xはsed、基本インストールでBSD を使用します。
クリスジョンセン


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.