У меня есть 100 000. TXT файлов с форматом ниже:

bygrp,colnum,beta
100005,1,0.629519434191718
100005,2,-0.500000000026516
100005,3,0.560850895321124
100005,4,0.119624318119292
100005,5,0.257676682753309

И имена файлов: Job19_beta1.txt, ..., job19_beta100000.txt

Я создал total.txt, который включает в себя только строку заголовка: bygrp, colnum, beta.

Я хочу добавить только 3-ю строку (colnum = 2 в таблице) из 100 000 файлов в total.txt без заголовка.

Как я могу написать скрипт для этого? Я думаю, что мне нужно написать для ... сделать ... цикл, а затем скопировать, но не могу понять это ...

Я на самом деле аналитик SAS, но у меня есть проект, который требуется использовать командную строку для загрузки данных. Я погуглил много кодов, но все еще борюсь за сценарий. Заранее спасибо!

3 ответа3

0

Тестирование на Bash в Linux (не может гарантировать для Windows), это выглядит многообещающе:

for i in (*.txt)
do
tail -n +2 "$i" >> total.txt
done

-n +2 для tail выводит 2-ю строку вперед, пропуская только первую строку.

Или чтение из вашего списка файлов в формате .txt (возможно, излишнее использование cat, и если в именах файлов нет новых строк):

for i in $(cat a.txt)
do
tail -n +2 "$i" >> total.txt
done

Или использование find тоже должно сработать, вероятно, проще, если 100 000 текстовых файлов находятся в одном дереве папок и вам нужно немного покопаться.

find folder/ -name "*.txt" -exec tail -n +2 '{}' >> total.txt  \;
0

Чтобы прочитать имена файлов из файла:

while IFS= read -r filename; do
    sed 1d "$filename"
done < a.txt >> total.txt

Более эффективно, так как вам не нужно вызывать sed для каждого файла:

xargs awk 'FNR != 1' < a.txt >> total.txt

Это накапливает столько файловых аргументов в awk, сколько может содержать команда.

0

Я хочу добавить все данные из 100 000 файлов в total.txt, но без заголовка, поскольку он уже существует в total.txt

В этом случае и с использованием инструментов в стиле bash и unix:

tail -qn +2 job19_beta{1..100000}.txt >>total.txt

Как это устроено

  • job19_beta{1..100000}.txt раскрывает список файлов, которые вы хотите в их правильном порядке.

  • tail -qn +2 job19_beta{1..100000}.txt

    Это записывает в stdout содержимое всех файлов, начиная со строки 2.

    -n +2 указывает tail начинать со строки 2. -q указывает tail молчать и не печатать заголовки при смене файлов.

  • >>total.txt

    Это приводит к тому, что вывод команды tail добавляется к total.txt .

Альтернатива с использованием a.txt

Если вы хотите прочитать имена файлов из a.txt , то:

while IFS= read -r fname; do tail -n +2 "$fname"; done <a.txt >>total.txt

Вы не упомянули, как имена файлов разделены в a.txt поэтому я предположил, что они по одному на строку. (Обратите внимание, что имена файлов могут содержать символы новой строки в своих именах, так что это не общее решение.)

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