С awk
:
awk -F, '$2 != ref { i++; ref = $2 } { print $0 >"output" i }' input
разделит вход
в соответствии со вторым столбцом на файлы output1
, output2
...
Если вы хотите ограничить количество строк на выходе file:
awk -F, '$2 != ref { i++; ref = $2; lines = 0 } lines >= 1000 { i++; lines = 0 } { print $0 >"output" i; lines++ }' input
создаст выходные файлы, содержащие не более 1000 строк, соблюдая ограничение на второй столбец.
Вот еще один вариант, который разделяется при следующем изменении во втором столбце после достижения заданного лимита (в этом примере 1000 строк, предположительно, вы использовали бы 50000000):
awk -F, 'BEGIN { change = 1 } change && $2 != ref { i++; ref = $2; change = 0; lines = 0 } lines >= 1000 { change = 1 } { print $0 >"output" i; lines++; ref = $2 }' input
No necesita alias para tratar de obtener gdb
argumentos de aceptación.
En tu caso sería:
gdb firefox
(gdb) set args --safe-mode
En los shells POSIX, los alias solo se expanden en la posición de comando (donde se espera un comando )o después de los alias cuya expansión termina en un carácter en blanco (en zsh
, solo un espacio y en muchos otras implementaciones, solo espacio o pestaña )¹. También necesita la opción --args
a gdb
para poder pasar argumentos al programa que se está depurando. Entonces puedes hacer:
alias gdba='gdb --args ' # note the trailing space which does mean
# that aliases are to be expanded after it
alias ff='firefox --safe-mode'
gdba ff
¹ zsh también admite alias globales (conalias -g
)que se expanden en muchos más lugares, pero probablemente no querrá usar un alias de este tipo para su firefox --safe-mode
aquí, ya que no querría echo ff
, por ejemplo, generar otra cosa que no sea ff
.
Los alias son una característica del shell. La definición de un alias crea un nuevo nombre de comando de shell. Solo lo reconoce el shell y solo cuando aparece como un nombre de comando.
Por ejemplo, si escribe
> ff
en un indicador de shell, invocará su alias, pero si escribe
> echo ff
el ff
es solo un argumento, no un comando. (Al menos en bash, puedes jugar algunos trucos si la definición del alias termina con un espacio. Consulte la respuesta de Stéphane Chazelas para obtener una posible solución si está decidido a utilizar alias de shell.)
Escribiste
> gdb ff
por lo que el shell invocó gdb
, pasándole la cadena ff
como argumento.
Puede pasar argumentos al programa depurado a través de la línea de comando gdb
, pero debe usar la opción --args
. Por ejemplo:
> gdb firefox --safe-mode
intenta (y falla )en tratar --safe-mode
como una opción para gdb
. Para ejecutar el comando con un argumento, puede hacerlo manualmente:
> gdb firefox
...
(gdb) run --safe-mode
o, como me recuerda la respuesta de thrig , puedes usar--args
:
> gdb --args firefox --safe-mode
...
(gdb) run
(El primer argumento que sigue a --args
es el nombre del comando; todos los argumentos restantes se pasan al comando invocado.)
Es posible extraer los argumentos de un alias de shell, pero recomendaría simplemente definir un alias separado:
alias ff='firefox --safe-mode'
alias gdbff='gdb --args firefox --safe-mode'
O, mejor, usar funciones de shell, que son mucho más versátiles. El manual de bash dice:
For almost every purpose, shell functions are preferred over aliases.