Текст к yaml преобразованию

Функционально подобный, но специфически отличающийся. По существу они оба читают набор данных из первого файла, пишут это в другой файл.

Когда я делаю strace на Linux:

$ strace cat /etc/fstab > test.txt
...
open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=691, ...}) = 0
fadvise64_64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "# /etc/fstab: static file system"..., 32768) = 691
write(1, "# /etc/fstab: static file system"..., 691) = 691
read(3, "", 32768)                      = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?

$ strace cp /etc/fstab test.log
...
open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=691, ...}) = 0
open("test.log", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0644) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
read(3, "# /etc/fstab: static file system"..., 32768) = 691
write(4, "# /etc/fstab: static file system"..., 691) = 691
read(3, "", 32768)                      = 0
close(4)                                = 0
close(3)                                = 0
_llseek(0, 0, 0xbfaa3fb0, SEEK_CUR)     = -1 ESPIPE (Illegal seek)
close(0)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
2
27.04.2016, 10:20
3 ответа

Вот один путь:

$ cat inf
your-email  your-order-id   PayPal-transaction-id   your-first-name your-second-name
s@ess.com   12345   54321   sooky   spooky
t@tee.com   23456   23456   kiki    dee
r@arrgh.com 34567   76543   cheeky  chappy
$ cat mkf.sh
awk '
BEGIN {
  print "---\n"
}
NR == 1 {
  nc = NF
  for(c = 1; c <= NF; c++) {
    h[c] = $c
  }
}
NR > 1 {
  for(c = 1; c <= nc; c++) {
    printf h[c] ": " $c "\n"
  }
  print ""
}' inf
$ ./mkf.sh inf
---

your-email: s@ess.com
your-order-id: 12345
PayPal-transaction-id: 54321
your-first-name: sooky
your-second-name: spooky

your-email: t@tee.com
your-order-id: 23456
PayPal-transaction-id: 23456
your-first-name: kiki
your-second-name: dee

your-email: r@arrgh.com
your-order-id: 34567
PayPal-transaction-id: 76543
your-first-name: cheeky
your-second-name: chappy
3
27.01.2020, 22:06
  • 1
    Это является большим.Спасибо. Я был бы upvote, но моя плохая репутация устраняет тот :-( –  duff 28.05.2013, 11:47
  • 2
    @duff Никакие заботы, довольные, это работало как ожидалось на Вас! –  icyrock.com 29.05.2013, 04:23

Вы попытались определить повторяемую целочисленную переменную, обнуленную в, начинаются и работают, если/еще оператор, что, если "проход == 0" сохраняет имена полей к элементам в массиве затем автоинкременты целое число или иначе он, запись печатает, Вы записали (кроме распечатывания полей при помощи Вашего i повторяемый? (больше информации о массивах awk).

Я не протестировал этот код вообще (и я сосу что-то ужасное в awk в целом), но это должно служить конкретной иллюстрацией общего понятия программирования/сценариев:

#!/usr/bin/awk
FS=="\t"
BEGIN {
   print "---"
   iter=0
} 
NR==1 
{

   if (iter == 0)
      for (i=1;i<=NF;i++) 
         newArr[i]=$i
      iter++
   else
      for (i=1;i<=NF;i++) 
         print newArr[i] ": " $i

}
0
27.01.2020, 22:06
  • 1
    я получаю синтаксическую ошибку при попытке выполнить это:gawk: ./a.awk:15: else стрелка (^) указывает e из еще. Вы могли объяснить NR==1? Разве это не заставит Ваш код выполниться только на первой строке? –  terdon♦ 28.05.2013, 02:46
  • 2
    Да, как я сказал, это была просто иллюстрация, не заключительный код. Я похож на @icyrock.com, по существу воссоздал тот же основной сценарий кроме использования NR вместо, если/еще оператор. Я попытался бы использовать их код. –  Bratchley 28.05.2013, 02:50
  • 3
    OK, достаточно ярмарка, я думал, что это был некоторый темный обман, о котором я не знал :). Извините, в следующий раз я прочитаю текст Вашего ответа, а также кода. –  terdon♦ 28.05.2013, 02:51
  • 4
    я не означал ловить NR, это из Вашего кода, что Вы, если, я просто отделался от этого как от шаблона. Рядом как я могу сказать из кода другого человека, он соответствует номерам строки, таким образом, я принимаю NR "количество записи" и оператора, прежде чем изогнутая фигурная скобка будет условным оператором. один только –  Bratchley 28.05.2013, 02:52

Я уверен, что в этом можно выполнить awk но если ответ Perl приемлем, это должно сделать то, в чем Вы нуждаетесь:

#!/usr/bin/env perl
print "---\n";
while (<>) {
    chomp;
    ## This splits the line at one or more whitespace characters
    ## into the array @fields.
    @fields=split(/\t+/);
    ## Get the column names if this is the 1st line
    if ($.==1){@cols=@fields}
    ## Print the data if it is not the first line
    else {
      print "\n";
      for ($i=0;$i<=$#fields;$i++){
        print "$cols[$i] : $fields[$i]\n";
      }
    }
} 

Например:

$./foo.pl input_text.txt
---

your-email: s@ess.com
your-order-id: 12345
PayPal-transaction-id: 54321
your-first-name: sooky
your-second-name: spooky

your-email: t@tee.com
your-order-id: 23456
PayPal-transaction-id: 23456
your-first-name: kiki
your-second-name: dee

your-email: r@arrgh.com
your-order-id: 34567
PayPal-transaction-id: 76543
your-first-name: cheeky
your-second-name: chappy

Это может быть сжато в остроту с помощью Perl -a опция, которая разделяет каждую строку на массив @F:

echo "---";perl  -aF"\t" -ne 'if ($.==1){@c=@F; chomp($c[$#c]);}else {
 print "\n";for ($i=0;$i<=$#F;$i++){print "$c[$i]: $F[$i]\n";}}' input_text.txt
0
27.01.2020, 22:06

Теги

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