cat 出力から最初の行と最後の行を読み取るにはどうすればよいでしょうか?

cat 出力から最初の行と最後の行を読み取るにはどうすればよいでしょうか?

テキストファイルがあります。タスク - ファイルから最初の行と最後の行を取得します

$ cat file | grep -E "1|2|3|4" | commandtoprint

$ cat file
1
2
3
4
5

cat 出力なしでこれが必要です (1 と 5 のみ)。

~$ cat file | tee >(head -n 1) >(wc -l)
1
2
3
4
5
5
1

おそらく awk やもっと短い解決策が存在するでしょう...

答え1

sed解決:

sed -e 1b -e '$!d' file

から読み取る場合、stdin次のようになります (例ps -ef)。

ps -ef | sed -e 1b -e '$!d'
UID        PID  PPID  C STIME TTY          TIME CMD
root      1931  1837  0 20:05 pts/0    00:00:00 sed -e 1b -e $!d

頭と尾解決:

(head -n1 && tail -n1) <file

データがコマンド ( ps -ef) から来ている場合:

ps -ef 2>&1 | (head -n1 && tail -n1)
UID        PID  PPID  C STIME TTY          TIME CMD
root      2068  1837  0 20:13 pts/0    00:00:00 -bash

awk解決:

awk 'NR==1; END{print}' file

また、パイプされた例は次のとおりですps -ef:

ps -ef | awk 'NR==1; END{print}'
UID        PID  PPID  C STIME TTY          TIME CMD
root      1935  1837  0 20:07 pts/0    00:00:00 awk NR==1; END{print}

答え2

sed -n '1p;$p' file.txtfile.txt の 1 行目と最後の行を出力します。

答え3

面白い純粋なBash≥4の方法:

cb() { (($1-1>0)) && unset "ary[$1-1]"; }
mapfile -t -C cb -c 1 ary < file

この後、ary最初のフィールド (つまり、インデックス0) が の最初の行でfile、最後のフィールドが の最後の行である配列が作成されますfile。コールバックcb(配列内のすべての行を読み込む場合はオプション) は、メモリが乱雑にならないように、すべての中間行を設定解除します。無料の副産物として、ファイル内の行数も取得されます (配列の最後のインデックス + 1)。

デモ:

$ mapfile -t -C cb -c 1 ary < <(printf '%s\n' {a..z})
$ declare -p ary
declare -a ary='([0]="a" [25]="z")'
$ # With only one line
$ mapfile -t -C cb -c 1 ary < <(printf '%s\n' "only one line")
$ declare -p ary
declare -a ary='([0]="only one line")'
$ # With an empty file
$ mapfile -t -C cb -c 1 ary < <(:)
declare -a ary='()'

答え4

猫なし:

$ cat file |tee >(head -n1) >(tail -n1) >/dev/null
1
5

または

$ (head -n1 file;tail -n1 file)
1
5

関連情報