print - awk separador de campos
Encontrar un valor comĂșn en varios archivos que contienen valores de columna individual (4)
Tengo 100 archivos de texto que contienen columnas individuales cada uno. Los archivos son como:
file1.txt
10032
19873
18326
file2.txt
10032
19873
11254
file3.txt
15478
10032
11254
y así. El tamaño de cada archivo es diferente. Amablemente dígame cómo encontrar los números que son comunes en todos estos 100 archivos.
Archivos con una sola columna ?
Puede ordenar y comparar estos archivos, usando shell:
for f in file*.txt; do sort $f|uniq; done|sort|uniq -c -d
Last -c
no es necesario, solo es necesario si desea contar el número de ocurrencias.
Esto funcionará independientemente de si el mismo número puede aparecer varias veces en 1 archivo:
$ awk ''{a[$0][ARGIND]} END{for (i in a) if (length(a[i])==ARGIND) print i}'' file[123]
10032
Lo anterior usa GNU awk para verdaderas matrices multidimensionales y ARGIND. Hay ajustes fáciles para otros awks si es necesario, por ejemplo:
$ awk ''!seen[$0,FILENAME]++{a[$0]++} END{for (i in a) if (a[i]==ARGC-1) print i}'' file[123]
10032
Si los números son únicos en cada archivo, todo lo que necesita es:
$ awk ''(++c[$0])==(ARGC-1)'' file*
10032
Una usando Bash y comm
porque necesitaba saber si funcionaría. Mis archivos de prueba fueron 1
, 2
y 3
, de ahí el for f in ?
:
f=$(shuf -n1 -e ?) # pick one file randomly for initial comms file
sort "$f" > comms
for f in ? # this time for all files
do
comm -1 -2 <(sort "$f") comms > tmp # comms should be in sorted order always
# grep -Fxf "$f" comms > tmp # another solution, thanks @Sundeep
mv tmp comms
done
awk
al rescate!
para encontrar el elemento común en todos los archivos (asumiendo la singularidad dentro del mismo archivo)
awk ''{a[$1]++} END{for(k in a) if(a[k]==ARGC-1) print k}'' files
cuente todas las ocurrencias e imprima los valores donde contar equivale a la cantidad de archivos.