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 < cool
stdinを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
。とを参照してください。tail
man head
man tail