2015-12-21 2 views
0

У меня есть несколько файлов .tsv с именем choochoo1.tsv, choochoo2.tsv, ... choochoo(nth).tsv файлов. У меня также есть файл main.tsv. Я хочу извлечь строку заголовка в main.tsv и вставить все файлы choochoo(nth).tsv. Обратите внимание, что в каталоге есть другие файлы .tsv, которые я не хочу изменять или вставлять в заголовок, поэтому я не могу сделать *.tsv и выбрать все файлы .tsv (так что нужно выбрать choochoo строку для разыскиваемых файлов). Это то, что я попробовал, используя скрипт bash, но не смог заставить его работать. Пожалуйста, предложите правильный способ сделать это.Вставьте строку заголовка в несколько разделов tsv (разделенные вкладками)

for x in *choochoo; do 
    head -n1 main.tsv > $x 
done 
+1

Возможный дубликат [Добавление заголовка в несколько текстовых файлов] (http://stackoverflow.com/questions/13196993/adding-header -into-multiple-text-files) – muru

+0

@muru Я видел это сообщение, но это не помогло! – MAPK

+0

@MAPK: Почему это не помогло? Это касается почти той ситуации, с которой вы сталкиваетесь. Единственное предельное различие (акцент на «маргинальный») заключается в том, что вам нужно собрать линию, которая будет вставлена ​​из первой строки другого файла; этого недостаточно, чтобы оправдать требование «это не помогает». Тебе разрешено думать самим. (Это также хорошая идея, чтобы объяснить, почему что-то, что должно помочь, не помогает.) –

ответ

1

У вас есть проблема с файлом Glob, а также перенаправлять:

  • файл Глоб будет ловить вещи, как AAchoochoo, но не choochoo1.tsv и даже не AAchoochoo.tsv
  • редирект перепишет существующие файлы вместо добавления к ним. Команда перенаправления для добавления в файл - >>, но это добавит текст в конец, и вы хотите добавить текст в начале.

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

Вы можете использовать временный файл, что-то вроде этого:

for x in choochoo[0-9]*.tsv; do 
    mv "$x"{,.orig} 
    (head -n1 main.tsv; cat "$x.orig") > $x 
    rm "$x.orig" 
done 
+0

Спасибо, это работает, но как вы включаете файлы с буквенными числовыми значениями в конце? Похоже, что вы делаете что-то вроде этого: 'for x in chochoo [^ a-zA-Z0-9] *. Tsv'? – MAPK

+0

* в glob означает «все остальное», а не «повторять последнее предложение», как в регулярном выражении, поэтому 'choochoo [0-9] *. Tsv' может соответствовать' choochoo2.tsv', а также 'choochoo2nd. tsv'. Прочитайте разницу между глобусами и регулярными выражениями. – Guss

+0

Спасибо, но мой вопрос в том, что если это choochooX.tsv – MAPK

Смежные вопросы