У меня есть куча * .csv файлов, которые используют заголовки. Прямо сейчас файлы имеют заголовки и одинаковое количество строк данных. Мне нужно стереть данные в этих файлах, поэтому я решил просто перезаписать заголовок в файлы. У меня есть файл A настроенный правильно с заголовком. Как я могу cat A во всех других файлах CSV?

Кроме того, как я могу удалить последние X строк из файлов? Путь к файлам */*.csv

2 ответа2

1

Вы можете использовать sed и некоторую креативность, чтобы преобразовать список файлов (или что-нибудь еще) в список команд.

Это тест, он просто выведет команды для вас, чтобы увидеть, что произойдет:

$ ls *.cvs | sed "s/.*/cat headerfile.cvs > &/"

Если вам это нравится, сделайте то же самое и перенаправьте его в вашу любимую оболочку:

$ ls *.cvs | sed "s/.*/cat headerfile.cvs > &/" | bash

Или для рекурсивного решения вы можете использовать find:

find . -name \*.cvs | sed "s/.*/cat headerfile.cvs > &/" | bash
1
  1. Cat заголовок в каждом из файлов. Я предполагаю, что A - это файл, так как вы упомянули cat . Если это так, вы можете просто скопировать:

    for file in */*.csv; do cp A "$file"; done
    

    Если A является переменной, сделайте

    for file in */*.csv; do echo "A" > "$file"; done
    

    В качестве альтернативы, если вам нужна только первая строка, вы можете указать это в каждом файле. Таким образом, он также будет работать для разных заголовков:

    for file in */*.csv; do head -n "$file" > /tmp/foo && 
      mv /tmp/foo "$file"; 
    done
    
  2. Есть много способов удалить последние X строк из файлов. Вот три:

    • head, измените X на столько строк, сколько хотите сохранить:

      for file in */*.csv; do
        head -n X $file > /tmp/foo && mv /tmp/foo "$file"; 
      done
      
    • awk , измените 123 на столько строк, сколько хотите сохранить:

      for file in */*.csv; do
        awk 'NR<=123' "$file" > /tmp/foo && mv /tmp/foo "$file"; 
      done
      
    • perl , измените 123 на столько строк, сколько хотите сохранить:

      for file in */*.csv; do
        perl -ne "next if $.>123;print' "$file" > /tmp/foo && 
        mv /tmp/foo "$file"; 
      done
      

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .