Вставка строк с помощью awk

#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)