Питання про awk


9

Гаразд, оскільки це складне питання, я його чітко поясню. Я отримав вміст файлу, як показано нижче:

$ Cat File1 
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {TBMKF}
ABC Cool Lol POP {YUKER}
ABC Cool Lol POP {EFEFVD}

Вихід, який я хочу

-Cool MNB +  POP ;
-Cool MNB  + POP ;
-Cool MNB  + POP ;
-Cool TBMKF + POP ;
-Cool YUKER + POP ;
-Cool EFEFVD +POP ;

По-перше, я намагаюся вийняти останній стовпчик із File1та роздрукувати його sed 's/[{}//g' File1 > File3

Після цього я копіюю весь вміст File1на новийFile4

cp File1 File4

Після цього я замінити дані всередині File4з File3даними (це дані без кронштейна один « File1останній рядок, один»)

awk 'FNR==NR{a[NR]=$1;next}{$5=a[FNR]}1' File3 File4 >>File5 

Вихід повинен бути таким

ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP TBMKF
ABC Cool Lol POP YUKER
ABC Cool Lol POP EFEFVD

Нарешті, я намагаюся

awk -F " '{print - $2,$5 +,$4 ";"}‘ File5

Але результат не вийшов так, як показано мені хочеться, лише подібні дані MNB перераховані внизу, інші не відображаються (Завантажте дані останнього стовпця),


Ви використовуєте gnu awk?
123

я не впевнений, що ти маєш на увазі. Але я просто новий початківець для дотику до awk. Це завдання, яке мені потрібно зробити, я намагаюся зробити все можливе, щоб повільно зробити один крок до одного кроку, щоб зробити це, грунтуючись на моєму розумінні awk.
heng960407

1
тип awk --version, який результат?
123

2
Будь ласка, змініть назву на щось більш конкретне для вашої проблеми. Це полегшить пошук інших, у кого є подібні запитання в майбутньому. На даний момент "Питання про awk" є дуже загальним.
Том Фенех

Відповіді:


16

Я не знаю, чому ви копіюєте речі ліворуч та праворуч. Проста річ

awk '{print "-" $2, substr($5,2,length($5)-2), "+", $4, ";"}' File1

Я ставлю на -початку і ;в кінці потім.

Між ними друкуємо

  • $2 тому що ми хочемо, як є.
  • підрядка $5, що є рядком без першого та останнього символу. Ми пропускаємо перший символ, починаючи з позиції 2 (awk завжди був дивний з цього приводу) і залишаємо останній символ, лише вибираючи підрядку, яка на два символи коротша, ніж оригінал$5
  • +тому що ми хочемо , щоб це
  • і потім $4

Однак я не впевнений, чи всі ці рядкові функції є специфічними для GNU awk.


substr(string, 2)повертає підрядок , починаючи з другого символу, як cut -c2-, tail -n +2, sed '2,$'... Що так дивно про це?
Стефан Шазелас

3
Ця команда є стандартною і навіть працює з оригіналом awkз 70-х.
Стефан Шазелас

@ StéphaneChazelas: Ах, я чекав на вас :-) Зазвичай ми починаємо рахувати з 0, що означає, що індекс 2 є третьою позицією, але тут друга позиція знаходиться на індексі 2. Дякую за уточнення решти питання GNU.
Bananguin

@Bananguin, в оболонці та утилітах Unix, як показано в декількох прикладах вище, ми починаємо з 1, а не 0. Найбільш помітними винятками є масиви ksh та $ {var: offset} (обидва скопійовані bash). Усі інші масиви оболонок починаються з 1. Дивіться також Чи є причина, чому перший елемент масиву Zsh індексується 1 замість 0?
Стефан Шазелас

7

З sed

sed '
    s/\S\+\s/-/
    s/\(\S\+\s\)\{2\}{\(\S\+\)}/\2 + \1;/
    ' File1

І awk варіація

awk -F"[[:blank:]{}]+" '{print "-" $2, $5, "+", $4}' ORS=" ;\n" File1

6

Легка робота TXR :

$ txr -c '@(repeat)
@a @b @c @d {@e}
@(do (put-line `-@b @e + @d ;`))
@(end)' -
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {TBMKF}
ABC Cool Lol POP {YUKER}
ABC Cool Lol POP {EFEFVD}
[Ctrl-D][Enter]
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool TBMKF + POP ;
-Cool YUKER + POP ;
-Cool EFEFVD + POP ;

Використання макросу TXR Lisp awk для транслітерації рішення Awk:

 txr -e '(awk (t (prn `-@[f 1] @{[f 4] [1..-1]} + @[f 3] ;`)))'

Поля знаходяться у fсписку, а індексація базується на нулі.


1
+1 для найгучнішого і найкрихкішого вигляду! Ця мова ОБОВ'ЯЗКОВА змагатися у pcg (код програмування гольфу)
Archemar

@Archemar TXR не дуже добре змагається з гольфу, оскільки є спеціалізовані мови, розроблені для того, які роблять такі функції, як присвоєння функцій окремим персонажам, які потім можна поєднати для досягнення складу.
Каз


1
@Kaz Десь є підручник з TXR? Сторінка людини здається досить величезною. Як це виконується порівняно з awk?
блі

1
@bli GNU Awk - це щось на кшталт принаймні в 30 разів швидше при розбитті базового поля через великий файл, ніж макрос TXR awk, який становить 220+ рядків інтерпретованого коду , включаючи загальний цикл для обробки джерел введення в записи та поля.
Каз

3

Використовувати awk найпростіше, коли $1,$2,...поля вже містять точні рядки, з якими потрібно працювати. Розділювач поля, якщо він містить більше одного символу, інтерпретується як регулярний вираз. Для позбавлення від {curly braces} нам не потрібно робити жодних операцій пошуку, заміни чи підрядки. Ми просто зараховуємо їх до складу роздільника.

awk -F'[ {}]+' '{printf("-%s %s + %s ;\n", $2, $5, $4)}'

Використання printfзамість цього printтакож полегшує перегляд того, як буде форматизований рядок, але якщо ви хочете мати print "-"$2,$5" + "$4";"замість цього printf("-%s %s + %s ;\n", $2, $5, $4), це варіант.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.