Преобразование данных в желаемую форму с помощью Linux

#linux #shell #unix #ubuntu

#linux #оболочка #unix #ubuntu

Вопрос:

У меня есть данные в файле, разделенном табуляцией, в следующей форме (filename.tsv):

 #a      0 Espert       A trius
#b      9 def          J
  

Я хочу преобразовать данные в следующую форму (я представляю здесь в каждой второй строке):

 #@<a>
<0 Espert> <abc> <A trius>.
#@<b>
<9 def> <abc> <J>.
  

Я представляю в каждой строке. Я знаю, как сделать то же самое с помощью python, используя csv-модуль. Но я пытаюсь изучить команды Linux, есть ли способ сделать то же самое в терминале Linux, используя команды Linux, такие как grep?

Комментарии:

1. python отлично работает в Linux.

2. @JohnC Я пытаюсь изучить команды Linux (например, grep и т.д.), Чтобы сделать то же самое

3. Вы не можете сделать это с помощью grep. Awk или bash все же будут работать. Я советую вам провести немного больше исследований и, по крайней мере, показать какую-то попытку, иначе вас достанут даунвотеры.

4. Что случилось с 9 из второй строки, второго столбца?

5. @CristianCiupitu Извините, это была опечатка. Очень жаль

Ответ №1:

awk кажется, подходящий инструмент для работы:

 awk '{ 
   printf "#@<%s>n<%s %s> <abc> <%s%s%s>.n", 
    substr($1,2),
    $2, 
    $3, 
    $4, 
    (length($5) ?  " " : ""),
    $5
 }' filename.tsv
  
  • awk перебирает все строки во входном файле и разбивает каждую строку на поля с помощью табуляции и /или пробелов; $1 ссылается на первое поле, $2 , на второе, …
  • printf функционирует так же, как в C: строка формата (шаблона), содержащая заполнители, сопровождается соответствующими аргументами для замены заполнителей.
  • substr($1,2) возвращает подстроку 1-го поля, начинающуюся со 2-го символа (т.е. a для 1-й строки, b для 2-й) — обратите внимание, что индексы в awk основаны на 1.
  • (length($5) ? " " : "") это троичное выражение в стиле C, которое возвращает один пробел, если 5-е поле непустое, и пустую строку в противном случае.