2009-12-01 37 views
9

tengo este file.csv:Dividir archivo basado en el delimitador de cadenas en bash.how?

coordinate1,coordinate2,value1 
11111,a1,65 
11111,a2,32 
22222,b1,39 
22222,b3,55 
33333,c5,12 
33333,c9,16 
coordinate1,coordinate2,value2 
54656,a1,65 
21342,a2,32 
23543,b1,39 
123123,b3,55 
568568,c5,12 
568568,c9,16 
123123,b3,55 
568568,c5,12 
568568,c9,16 
coordinate1,coordinate2,value3 
23543,b1,39 
123123,b3,55 
568568,c5,12 
568568,c9,16 
123123,b3,55 
23543,b1,39 
123123,b3,55 
568568,c5,12 
568568,c9,16 
123123,b3,55 
11111,a1,65 
11111,a2,32 
22222,b1,39 
22222,b3,55 
33333,c5,12 
33333,c9,16 

Ahora me gustaría dividir este archivo en 3 archivos, todo el mundo pizca único bloque de datos

Es: 1° file 
    coordinate1,coordinate2,value1 
    11111,a1,65 
    11111,a2,32 
    22222,b1,39 
    22222,b3,55 
    33333,c5,12 
    33333,c9,16 

Es: 2° file 
    coordinate1,coordinate2,value2 
    54656,a1,65 
    21342,a2,32 
    23543,b1,39 
    123123,b3,55 
    568568,c5,12 
    568568,c9,16 
    123123,b3,55 
    568568,c5,12 
    568568,c9,16 

Respuesta

16

robados descaradamente de this forum:

awk '/YOUR_TEXT_HERE/{n++}{print >"out" n ".txt" }' final.txt 

debe hacer el truco (reemplazando YOUR_TEXT_HERE, por supuesto).

reemplazándolo con sus condiciones, y enviar la salida a #file.txt con un archivo de entrada de a.txt:

 
$ awk '/coordinate1,coordinate2,value?/{n++}{print > n "file.txt" }' a.txt 
$ ls 
1file.txt 2file.txt 3file.txt a.txt 
$ cat 1file.txt 
coordinate1,coordinate2,value1 
11111,a1,65 
11111,a2,32 
22222,b1,39 
22222,b3,55 
33333,c5,12 
33333,c9,16 
$ cat 2file.txt 
coordinate1,coordinate2,value2 
54656,a1,65 
21342,a2,32 
23543,b1,39 
123123,b3,55 
568568,c5,12 
568568,c9,16 
123123,b3,55 
568568,c5,12 
568568,c9,16 
$ cat 3file.txt 
coordinate1,coordinate2,value3 
23543,b1,39 
123123,b3,55 
568568,c5,12 
568568,c9,16 
123123,b3,55 
23543,b1,39 
123123,b3,55 
568568,c5,12 
568568,c9,16 
123123,b3,55 
11111,a1,65 
11111,a2,32 
22222,b1,39 
22222,b3,55 
33333,c5,12 
33333,c9,16 
+0

Intenté este ejemplo. Me aparece el siguiente error: awk: error de sintaxis en la línea fuente 1 contexto es \t/coordinate1, coordinate2, value?/{N ++} {print> n >>> "file.txt" <<< –

+0

@RaffiKhatchadourian ¿Qué versión? de awk usaste? – Armali

+0

@Armali awk versión 20070501 –

1

Esta versión diferente de cotización de la otra respuesta También funciona con Windows CMD:

awk "/coordinate1,coordinate2,value?/{n++}{print>n\"file.txt\"}" a.txt 
3

Puede usar csplit:

csplit file.txt /^c.*/ {*} 

Esta sintaxis x funciona en cygwin pero no lo ha probado en otro lugar.

Cuestiones relacionadas