¿Cómo seleccionar, copyr y pegar algunas columnas de diferentes files y crear un file de ellos?

Quiero crear y organizar datos en un file a partir de una cantidad de files seleccionando partes de las columnas de los files proporcionados. Tengo más de 10 files para copyr las columnas segunda, tercera y cuarta de cada file y pegarlas en un solo file.

Esto también se puede hacer con bastante facilidad con awk .

 $ awk '{print $2,$3,$4}' *.txt > collapsed_output.txt 

Ejemplo

Aquí hay algunos datos de muestra.

 $ seq 20 | paste - - - - - > sample.txt 

Así es como se ven las líneas:

 $ head sample.txt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 

Ahora hagamos 10 copys:

 $ seq 10 | xargs -I{} cp sample.txt sample{}.txt 

Ahora tenemos los siguientes files:

 $ tree . |-- sample10.txt |-- sample1.txt |-- sample2.txt |-- sample3.txt |-- sample4.txt |-- sample5.txt |-- sample6.txt |-- sample7.txt |-- sample8.txt |-- sample9.txt `-- sample.txt 

Ahora si ejecutamos nuestro command awk :

 $ awk '{print $2, $3, $4}' sample{1..10}.txt | column -t 2 3 4 7 8 9 12 13 14 17 18 19 2 3 4 7 8 9 12 13 14 17 18 19 2 3 4 7 8 9 12 13 14 17 18 19 ... 

Aquí les muestro el resultado de los primeros 3 files ( sample01.txtsample03.txt ). También estoy formateando la salida con el command column -t , pero esto es solo para fines de visualización para que la salida sea más fácil de ver aquí en U & L.

El formatting adicional podría fácilmente hacerse dentro del command awk pero eso parecía estar más allá del scope de la pregunta.

Echa un vistazo a la utilidad de command-line llamada cut . Puede extraer columnas si están separadas por un delimitador único. Para recombinar las partes puede usar paste .

Si tiene, por ejemplo, un formatting típico separado por comas

 $ cat debts.csv Name,Age,Debt Alice,20,1337 Bob,30,42 $ cat pets.csv Name,Pet Alice,Dog Bob,Cat 

puedes extraer nombres y deudas con

 $ cut -d, -f1,3 debts.csv Name,Debt Alice,1337 Bob,42 

y combinar deudas con mascotas usando

 $ cut -d, -f2 pets.csv | paste -d, debts.csv - Name,Age,Debt,Pet Alice,20,1337,Dog Bob,30,42,Cat 
  • Con cut y paste , -d determina el delimitador de los campos,
  • -f selecciona las columnas para extraer para cut y
  • - ordera usar la input estándar (es decir, en el último caso de paste , desde la tubería) en lugar de un file.