#shell #awk
#ракушка #awk
Вопрос:
Как я могу вставить строку с помощью awk?
Мой файл выглядит так:
1 43 2 34 3 65 4 75
Я хотел бы вставить три строки с «?» Таким образом, мой файл желаний выглядит следующим образом:
1 ? 2 ? 3 ? 4 43 5 34 6 65 7 75
Я пытаюсь использовать приведенный ниже сценарий.
awk '{if(NRlt;=3){print "NR ?"}} {printf" " NR $2}' file.txt
Ответ №1:
Вот один из способов сделать это:
$ awk 'BEGIN{s=" "; for(c=1; clt;4; c ) print c s "?"} {print c s $2; c }' ip.txt 1 ? 2 ? 3 ? 4 43 5 34 6 65 7 75
Ответ №2:
$ awk 'BEGIN {printf "1 ?n2 ?n3 ?n"} {printf "%d", $1 3; printf " %sn", $2}' file.txt 1 ? 2 ? 3 ? 4 43 5 34 6 65 7 75
Ответ №3:
Вы также можете добавить 3 строки перед awk, например:
{ seq 3; cat file.txt; } | awk 'NR lt;= 3 { $2 = "?" } $1 = NR' OFS='t'
Выход:
1 ? 2 ? 3 ? 4 43 5 34 6 65 7 75
Ответ №4:
Я бы сделал это следующим образом , используя GNU AWK
, пусть file.txt
контент будет
1 43 2 34 3 65 4 75
затем
awk 'BEGIN{OFS=" "}NR==1{print 1,"?";print 2,"?";print 3,"?"}{print NR 3,$2}' file.txt
выход
1 ? 2 ? 3 ? 4 43 5 34 6 65 7 75
Пояснение: Я установил разделитель выходных полей ( OFS
) на 7 пробелов. Для 1-й строки я печатаю три строки, состоящие из последующего числа и ?
срезанные разделителем выходных полей. Вы можете сделать это с помощью for
цикла, особенно если ожидаете, что это требование может измениться здесь. Для каждой строки я печатаю номер строки плюс 4 (для поддержания порядка) и 2-й столбец ( $2
). Благодаря использованию OFS вам потребуется внести только одно изменение, если будет изменено требование в отношении количества мест. Обратите внимание, что конструкция типа
{if(condition){dosomething}}
может быть написано GNU AWK
более лаконично, как
(condition){dosomething}
(проверено в gawk 4.2.1)