Очистить несколько файлов журнала .csv, но сохранить заголовок

Это только вставка чисел и сохранение лишних пробелов в строках вашего примера.

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
0
12.06.2018, 18:28
2 ответа
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 1a 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/*.csvcoincide 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
1
28.04.2021, 23:45

Si tiene una versión de sedque proporciona una opción --in-placeo -i, puede reemplazar > "$file"por sed -i 4q "$file", donde 4es 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 ses probablemente superfluo al menos en GNU sed, ya que -iimplica-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

0
28.04.2021, 23:45

Теги

Похожие вопросы