¿Cómo leer la primera y última línea de la salida cat?

¿Cómo leer la primera y última línea de la salida cat?

Tengo un archivo de texto. Tarea: obtener la primera y la última línea del archivo después

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

$ cat file
1
2
3
4
5

Necesito esto sin salida cat (solo 1 y 5).

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

Quizás exista una solución awk y más corta ...

Respuesta1

sedSolución:

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

Al leer stdinif se vería así (por ejemplo 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

la cabeza de la colaSolución:

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

Cuando los datos provienen de un comando ( 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

awkSolución:

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

Y también el ejemplo canalizado con 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}

Respuesta2

sed -n '1p;$p' file.txtimprimirá la primera y última línea de file.txt.

Respuesta3

Una manera divertida y pura de Bash≥4:

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

Después de esto, tendrá una matriz arycon el primer campo (es decir, con índice 0) como la primera línea de filey su último campo como la última línea de file. La devolución de llamada cb(opcional si desea sorber todas las líneas de la matriz) desactiva todas las líneas intermedias para no saturar la memoria. Como subproducto gratuito, también tendrá el número de líneas en el archivo (como el último índice de la matriz+1).

Manifestación:

$ 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='()'

Respuesta4

Sin gato:

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

o

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

información relacionada