Это только вставка чисел и сохранение лишних пробелов в строках вашего примера.
awk '{gsub(/enhancer_/,"enhancer_"NR); print;}' fileinput.txt
вывод:
chr1 enhancer_1 875557 876449 . enhancer_1
chr1 enhancer_2 876970 877622 . enhancer_2
chr1 enhancer_3 995719 996320 . enhancer_3
chr1 enhancer_4 1142786 1143060 . enhancer_4
tmpfile=$( mktemp )
for pathname in /path/to/dir/*.csv; do
head -n 1 "$pathname" >"$tmpfile"
cat "$tmpfile >"$pathname"
done
rm "$tmpfile"
Es decir, extraiga el encabezado usando head -n 1
a un archivo temporal (asumiendo que es solo la primera línea ), luego trunque el archivo original e inserte el encabezado del archivo temporal.
Si el encabezado es exactamente idéntico en todos los archivos:
tmpfile=$( mktemp )
set -- /path/to/dir/*.csv
head -n 1 "$1" >"$tmpfile"
for pathname do
cat "$tmpfile" >"$pathname"
done
rm "$tmpfile"
Esto primero establece los parámetros posicionales en la lista de archivos que nos interesan, luego extrae el encabezado del primero de ellos. El ciclo itera sobre los parámetros posicionales (los archivos CSV )y trunca cada uno, insertando el encabezado.
En los dos ejemplos anteriores, se supone que el patrón /path/to/dir/*.csv
coincide con todos los archivos afectados. Un ejemplo del mundo real de un patrón real puede ser
/var/log/myprogram/dir1/*.csv /var/log/myprogram/dir2/*.csv
o, si está utilizando un shell que comprende la expansión de llaves:
/var/log/myprogram/{dir1,dir2}/*.csv
Si tiene una versión de sed
que proporciona una opción --in-place
o -i
, puede reemplazar > "$file"
por sed -i 4q "$file"
, donde 4
es la cantidad de líneas de encabezado que desea mantener. Tenga en cuenta que algunas implementaciones pueden requerir un archivo de copia de seguridad vacío explícito, es decir, -i ''
.
Si la cantidad de archivos no es demasiado grande, es posible que pueda evitar el bucle y simplemente pasar la lista de archivos directamente, p.
sed -si 4q subdir1/*.csv subdir2/*.csv
(el s
es probablemente superfluo al menos en GNU sed, ya que -i
implica-s
)
o usefind
find path/to/dir -name '*.csv' -execdir sed -si 4q {} +
Ver relacionado Cómo extraer solo el nombre del encabezado en un dato sin listar los datos mismos