Додавання стовпця значень у файл з обмеженими вкладками


17

Як я можу додати стовпчик значень у файл, який має певну кількість рядків. У мене вхідний файл такий:

Вхідний файл:

SPATA17 1   217947738
LYPLAL1 1   219383905
FAM47E  4   77192838
SHROOM3 4   77660162
SHROOM3 4   77660731
SHROOM3 4   77662248

Вихідний файл:

SPATA17 1   217947738 file1
LYPLAL1 1   219383905 file1
FAM47E  4   77192838  file1
SHROOM3 4   77660162  file1
SHROOM3 4   77660731  file1
SHROOM3 4   77662248  file1

У цьому випадку я хочу додати стовпчик значень до кількості рядків у файлі. Значення залишається послідовним, наприклад "file1".

Причина в тому, що у мене є 100 таких файлів. Я не хочу відкривати кожен файл і вставляти стовпчик. Також є спосіб автоматизувати це, зайшовши в каталог і додавши стовпець значень. Значення походить від імені файлу, яке потрібно додати в кожному рядку файла в останньому / першому стовпці.

Відповіді:


22

Ви можете використовувати однолінійну петлю так:

for f in file1 file2 file3; do sed -i "s/$/\t$f/" $f; done

Кожен файл зі списку використовуватиме sedдля додавання до кінця кожного рядка вкладку та ім'я файлу.

Пояснення:

  • Використовуючи -iпрапор з sedдля виконання заміни, перезаписуючи файл
  • Виконайте заміну на s/PATTERN/REPLACEMENT/. У цьому прикладі PATTERN - $це кінець рядка, а REPLACEMENT - це \t(= TAB), і $fце ім'я файлу зі змінної циклу. s///Команда в подвійних лапках , так що оболонка може розширити змінну.

Код працює. Чи можете ви пояснити вміст у цитатах?
Рон

Так само, як "awk" використовується під час роботи зі стовпцями, так і "sed" використовується для подібних ситуацій. Я новачок в "awk" і "sed".
Рон

@Ron sedє найбільш практичним для заміни шаблону та збереження на місці. Для вашої вимоги збереження файлу це був порівняно зручний варіант. Якщо вам не потрібно писати назад в той самий файл, який ви обробляєте, працювати, awkяк правило, набагато простіше.
janos

Особисто я awkзанадто часто стикаюсь з роздільниками поля введення / виводу, тому намагаюся уникати використання, коли це можливо, роблячи sedбільш привабливим.
user5359531

11

Давай, чому ти рекомендуєш ці потужні інструменти, коли є pasteкоманда!

$ cat a
A
B
C
D
$ cat b
1
2
3
4
$ paste a b
A   1
B   2
C   3
D   4

З невеликою хитрістю, ви могли б використовувати pasteдля мети ОП. Однак він не замінить файли на місці:

for f in file1 file2 file3; do 
    paste $f <(yes $f | head -n $(cat $f | wc -l)) > $f.new
done

Це вставить відповідне ім'я файлу як останній стовпець кожного файлу в новий файл filename.new


Спасибі! pasteце, безумовно, прихований дорогоцінний камінь.
neu242

10

Ви можете використовувати awk:

awk '{print $0, FILENAME}' file1 file2 file3 ...

Оскільки кожен файл має інше ім'я, тому я повинен це зробити 100 разів. Чи є спосіб зробити це один раз?
Рон

Ні, FILENAMEце змінна в awk, вона розширюється до поточного імені файлу, який awkобробляється. Ви просто зробите це один, подайте всі файли awk.
cuonglm

ОК, але як направити вихід у новий файл кожного файлу? AWK зберігає кожен файл під час обробки?
Рон

Якщо у вас є GNU awk 4.1.0або пізніше, ви можете використовувати -iдля редагування місця. В іншому випадку слід перенаправити awkвихід на тимчасовий файл, а потім використовувати grepдля вилучення рядка з кожного файлу.
cuonglm

Ну що можна зробитиfor file in *; do awk 'BEGIN{OFS="\t"}{print $0, FILENAME}' $file; done
fedorqui
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.