複数のラインセットをキャッチするためのヘッド/テールコマンド

複数のラインセットをキャッチするためのヘッド/テールコマンド

1つのコマンドでファイルの最初の2行(43行と44行)と最後の2行をインポートする必要があります。 &&または;同じ特殊演算子を使用せずに、ヘッド、テール、パイプコマンドのみを使用してそれらを印刷できますか?私が考えることができるのはこれだけです。

(cat cool | head -n 2) | (tail -n +43 | head -n 2) | (tail -n  2)

しかし、猫がいます...もう一つのオプションは

(head -n 2 < cool) | (tail -n +43 < cool | head -n 2) | (tail -n 2 < cool)

ただし、何らかの理由で最後の行のみが表示されます。

答え1

cat cool | headはい連合大学(猫を使うのは役に立ちません)。 2番目のコードを確認してみましょう。

(head -n 2 < cool) | (tail -n +43 < cool | head -n 2) | (tail -n 2 < cool)

驚くべきことは、| command < coolstdinを2回リダイレクトすることです。前のパイプラインコマンドの結果またはファイルを選択する必要がありますcool。どちらもオプションではありません。

今質問に戻ります。ソリューション単一ファイルの読み取り例:

  • 最初の42行を読み、最初の2行だけを表示し、次の40行を削除します。これは次のように翻訳されますhead -n 42 | head -n 2
  • 次の2行(行43と44)を表示します。これは次のように翻訳されますhead -n 2
  • 最後の2行を表示します。これは次のように翻訳されますtail -n 2

さて、これらすべてを総合してみてください。

( head -n 42 | head -n 2; head -n 2; tail -n 2 ) < cool

別の同様の推論:

( head -n 2; head -n 42 | tail -n 2; tail -n 2 ) < cool

答え2

head制約は and だけを使用するので、tail単一のコマンドでは要件を満たすことができないと思います。

# First two lines of the file "cool"
head -n2 cool

# Lines 43 and 44
head -n44 cool | tail -n2

# Last 2 lines
tail -n2 cool

1行に3つのコマンドで一緒に競合することができますが、コマンド「あなたの質問に記載されているように:

head -n2 cool; head -n44 cool | tail -n2; tail -n2 cool

インストールされているマニュアルを使用して、コマンドの理解を高めたい場合がありますhead。とを参照してください。tailman headman tail

関連情報