Вопрос про 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 15.09.16

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
Эта команда является стандартной и будет работать даже с оригиналом awk70-х годов.
Стефан Шазелас

@ StéphaneChazelas: Ах, я ждал вас :-) Обычно мы начинаем считать с 0, что означает, что индекс 2 является третьей позицией, но здесь вторая позиция находится в индексе 2. Спасибо за разъяснение оставшегося вопроса GNU.
Bananguin

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

7

С сед

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 не очень хорошо конкурирует в гольфе, потому что есть специальные языки, разработанные для этого, которые выполняют функции, такие как назначение функций отдельным персонажам, которые затем можно объединить для достижения композиции.
Каз

@Archemar Поместите запись в: codegolf.stackexchange.com/questions/68712/output-the-next-kana
Kaz

1
@ Kaz Есть ли где-нибудь учебник по TXR? Страница руководства кажется довольно огромной. Как это работает по сравнению с awk?
Бли

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

3

Использование awk проще всего, когда $1,$2,...поля уже содержат точные строки, с которыми вы хотите работать. Разделитель полей, если он содержит более одного символа, интерпретируется как регулярное выражение. Нам не нужно выполнять операции поиска и замены или подстроки, чтобы избавиться от {фигурных скобок}. Мы просто считаем их частью разделителя.

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.