
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 stdin
if 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.txt
imprimirá 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 ary
con el primer campo (es decir, con índice 0
) como la primera línea de file
y 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