Что такое однолинейный Ruby, эквивалентный RS, NF и OFS awk? - PullRequest
0 голосов
/ 31 января 2019

У меня есть этот файл:

1
2
3
4


a
b
c

XY
Z

Я хочу преобразовать каждый блок в TAB отдельную строку и добавить текущий timestamp в последнем столбце, чтобы получить вывод, подобный этому:

1   2   3   4   1548915098
a   b   c   1548915098
XY  Z   1548915098

Я могу использовать awk, чтобы сделать это так:

awk '$(NF+1)=systime()' RS= OFS="\t" file

, где пустое RS эквивалентно заданному RS="\n\n+".

Но я хочу использовать Ruby на одной строке для этого.Я придумал это:

ruby -a -ne 'BEGIN{@lines=Array.new}; if ($_ !~ /^$/) then @lines.push($_.chomp) else (puts @lines.push(Time.now.to_i.to_s).join "\t"; @lines=Array.new) unless @lines.empty? end; END{puts @lines.push(Time.now.to_i.to_s).join "\t" unless @lines.empty?}' file

, что как-то неловко.

Есть ли какой-нибудь элегантный способ сделать это?
И есть ли ruby, эквивалентный awk 'RS, NF и OFS?
Спасибо:)

1 Ответ

0 голосов
/ 31 января 2019
$ awk '$(NF+1)=systime()' RS= OFS="\t" ip.txt
1   2   3   4   1548917728
a   b   c   1548917728
XY  Z   1548917728

$ # .to_s can be ignored here, since puts will take care of it
$ ruby -00 -lane '$F.append(Time.now.to_i.to_s); puts $F.join("\t")' ip.txt
1   2   3   4   1548917730
a   b   c   1548917730
XY  Z   1548917730
  • -00 режим абзаца
  • -a автоматическое разделение, результаты доступны из $F массива
  • -l разделитель записей chomps
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...