#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-е поле непустое, и пустую строку в противном случае.