Свяжите несколько файлов с тем же заголовком

Использовать find -printf управляйте для вывода обоих время (поддающимся сортировке способом) и файл, затем вид. Если Вы используете GNU, находят,

find . your-options -printf "%T+\t%p\n" | sort
26
08.01.2013, 20:41
6 ответов

Если Вы знаете, как сделать это в R, то любой ценой делают это в R. С классическими инструментами Unix это наиболее естественно сделано в awk.

awk '
    FNR==1 && NR!=1 { while (/^<header>/) getline; }
    1 {print}
' file*.txt >all.txt

Первая строка awk сценария соответствует первой строке файла (FNR==1) кроме того, если это - также первая строка через все файлы (NR==1). Когда эти условия соблюдают, выражение while (/^<header>/) getline; выполняется, который заставляет awk продолжать читать другую строку (пропускающий текущую) как долго, поскольку текущий соответствует regexp ^<header>. Вторая строка awk сценария печатает все за исключением строк, которые были ранее пропущены.

18
27.01.2020, 19:39
  • 1
    Спасибо Gilles. Каждый из моих файлов находится в ГБ. R не будет эффективен, делают это. Вот почему я спросил. –  Jana 08.01.2013, 19:54
  • 2
    @Jana Является там строками, которые похожи на заголовки, но не являются наверху файла? В противном случае самый быстрый путь состоит в том, чтобы использовать grep (как в ответе спутника). –  Gilles 'SO- stop being evil' 08.01.2013, 20:39
  • 3
    No строки заголовка подобен всем файлам, и они только наверху каждого файла. Да grep был быстрее. Спасибо вы оба –  Jana 08.01.2013, 23:54
  • 4
    @Jana Между прочим, если все Ваши файлы имеют то же количество строк заголовка, вот иначе (который я ожидаю быть еще быстрее): head -n 10 file1.txt >output.txt && tail -q -n +11 file*.txt >>output.txt (если у Вас есть 10 строк заголовка). Кроме того, если Ваши файлы имеют числа на свои имена, остерегаются этого file9.txt отсортирован между file89.txt и file90.txt. Если Ваши файлы имеют числа как file001.txt, …, files009.txt, files010.txt, …, затем files*.txt перечислит их в правильном порядке. –  Gilles 'SO- stop being evil' 09.01.2013, 00:01
  • 5
    лучшее решение (из stackoverflow.com/a/16890695/310441), который не требует соответствия regex: awk 'FNR==1 && NR!=1{next;}{print}' *.csv –  Owen 16.03.2017, 17:28

Попытайтесь делать это:

$ cat file1.txt; grep -v "^<header" file2.txt
<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
A
B 
C
D
E 
F

Примечание:

  • -v отметьте означает инвертировать соответствие
  • ^ в REGEX, средства начаться строки
  • если у Вас есть набор файлов, можно сделать

:

array=( files*.txt )
{ cat ${array[@]:0:1}; grep -v "^<header" ${array[@]:1}; } > new_file.txt

Это - метод разрезания массива .

4
27.01.2020, 19:39
  • 1
    Спасибо спутник, Но у меня есть ~30 файлов (file1.txt,file2.txt,file3.txt..filen.txt), который будет связан. Я должен ввести каждое имя файла или являюсь там какими-либо другими способами сделать это? –  Jana 07.01.2013, 23:53
  • 2
    См. мое отредактированное сообщение с режущей техникой –  Gilles Quenot 08.01.2013, 00:02
  • 3
    Это удаляет <header> строки где угодно в файлах, не просто вначале. Это не может быть проблемой здесь, в зависимости от данных. –  Gilles 'SO- stop being evil' 08.01.2013, 20:39
  • 4
    Более простой: grep '^<header>' file1.txt >output.txt && grep -v '^<header>' file*.txt >>output.txt –  Gilles 'SO- stop being evil' 08.01.2013, 20:41
  • 5
    @Gilles: Я заметил Ваш ответ после долгого времени, но это было очень полезно –  Jana 18.01.2013, 01:21
[114728]Команда [115164]tail[115165] (по крайней мере, в GNU) имеет возможность пропустить заданное количество начальных строк. Для печати, начиная со второй строки, т.е. пропустить заголовок одной строки, выполните: [115166]tail -n+2 my file

So, чтобы сохранить двухстрочный заголовок первого файла, но не второго, в Bash:

Or, для многих файлов:

If a certain string is known to be present in all header lines but never in the rest of the input files, [115168]grep -v[115169] is a simpler approach, as sputnik показал.[114735]

1
27.01.2020, 19:39

Другое решение, похожее на « CAT + GREP » сверху, с использованием хвоста и голова :

  1. Написать заголовок первого файла в Выход:

     Head -2 File1.txt> All.txt
     

    - Глава -2 получает 2 первых строки файла.

  2. Добавьте содержимое всех файлов:

     Хвост -N +3 -Q файл * .txt >> all.txt
     

    - -N +3 делает хвост линий печати от 3 до конца, -Q говорит ему не печатать заголовок с именем файла (READ MAN ), >> добавляет к файлу, не перезаписывает его как > .

И уверена, что вы можете поставить обе команды в одну строку:

head -2 file1.txt > all.txt; tail -n +3 -q file*.txt >> all.txt

или вместо ; PUT && между ними для проверки успеха.

42
27.01.2020, 19:39

Короче (не обязательно быстрее) с SED :

sed -e '3,${/^<header>/d' -e '}' file*.txt > all.txt

Это удалит все строки, начиная с

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

sed '1{
: again
n
/^<header>/b again
}
/^<header>/d
' file*.txt > all.txt
1
27.01.2020, 19:39

массив = (* .txt); заголовок -1 $ {массив [0]}> all.txt; tail -n +2 -q $ {array [@]: 0} >> all.txt

Предполагается, что вы используете папку с файлами .txt с тем же заголовком, которые необходимо объединить / объединить этот код объединит все текстовые файлы в all.txt с одним заголовком. первая строка (строки, разделенные точкой с запятой) собирает все текстовые файлы для объединения, вторые строки выводят заголовок из первого текстового файла в all.txt , а последняя строка объединяет все текстовые файлы, собранные без заголовок (начиная со строки 2 и далее) и добавляет его в all.txt .

0
27.01.2020, 19:39

Теги

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