Использование awk в качестве простого механизма шаблонов, как изменить вывод последней строки из getline

Правильный способ, которым я обнаружил в Ubuntu, был sudo fuser -a -k /usr/lib/gvfs .{{1} } Чтобы узнать больше, воспользуйтесь командой man fuser .

2
24.08.2017, 00:33
2 ответа

Один из способов сделать это — подсчитать количество строк в начале вашего скрипта. При выводе выводите запятую в конце только в том случае, если ваш номер строки не совпадает с количеством строк. Как это сделать, объясняется здесь .

Другой подход заключается в том, чтобы не печатать запятую при выводе первой записи и печатать одну перед последующими записями. Это можно сделать следующим образом:

 awk -F, '{if (!i)printf "\""$0"\"";else printf ",\n\""$0"\"";i=1}END{print ""}' a.in

Это определенно намного чище.

Есть и третий путь. Код

 if(getline == 0)

читает следующую строку и, следовательно, сообщает вам, находитесь ли вы в конце файла. Это даже чище, чем описанный выше метод, но влечет за собой накладные расходы из-за двойного чтения файла, поэтому я не использую его, если только второй метод не дает сбой (, например, мне нужно обработать следующий -- -последняя строка тоже по-другому ).

2
27.01.2020, 22:18

Это может быть проще сделать так:

sed 's/.*/"&"/;$!s/$/,/' test_file.js | sed '/#include_code/{
  r /dev/stdin
  d;}' template

(при условии, что #include_codeвстречается только один раз).

С помощью awkвы можете сделать это следующим образом:

awk '
  /#include_code/ {
    sep = ""
    while((getline < "test_file.js") > 0) {
      printf "%s", sep "\"" $0 "\""
      sep = ",\n"
    }
    if (sep) print ""
    next
  }
  {print}' template

Вы также можете использовать подход, подобный подходу sedвыше:

CODE='test_file.js' SED='sed '\''s/.*/"&"/;$!s/$/,/'\' "$CODE"' awk '
  /#include_code/{system(ENVIRON["SED"); next};{print}' template
1
27.01.2020, 22:18

Теги

Похожие вопросы