Функционально подобный, но специфически отличающийся. По существу они оба читают набор данных из первого файла, пишут это в другой файл.
Когда я делаю 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) = ?
Вот один путь:
$ 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
Вы попытались определить повторяемую целочисленную переменную, обнуленную в, начинаются и работают, если/еще оператор, что, если "проход == 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
}
gawk: ./a.awk:15: else
стрелка (^
) указывает e
из еще. Вы могли объяснить NR==1
? Разве это не заставит Ваш код выполниться только на первой строке?
– terdon♦
28.05.2013, 02:46
NR
вместо, если/еще оператор. Я попытался бы использовать их код.
– Bratchley
28.05.2013, 02:50
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