Сделайте первый столбец как заголовок и перечислите его соответствующие значения с помощью сценария оболочки

У меня есть большое содержимое файла, как показано ниже:

Quantity 20589 Quantity 12297 Quantity 100346 Quantity 0 Quantity 141999 Quantity 23662 Quantity 551071 Quantity 72917 Quantity 60460 Quantity 19712 Quantity 35530 Quantity 0 Quantity 29818 Price 0 Price 0 Price 0 Price 0 Price 0 Price 0 Price 0 Price 0 Price 0 Price 0 Price 0 Price 0 Price 0 Discount 100 Discount 100 Discount 100 Discount 100 Discount 100 Discount 100 Discount 100 Discount 100 Discount 100 Discount 100 Discount 100 Discount 100 Discount 100 

Из этого файла я хочу создать новый файл, который должен иметь данные как: –

 Quantity,Price,Discount 20589,0,100 12297,0,100 100346,0,100 0,0,100 141999,0,100 23662,0,100 551071,0,100 72917,0,100 60460,0,100 19712,0,100 35530,0,100 0,0,100 29818,0,100 

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

Пожалуйста, помогите мне написать новый файл, используя сценарий оболочки.

2 Solutions collect form web for “Сделайте первый столбец как заголовок и перечислите его соответствующие значения с помощью сценария оболочки”

Все можно сделать в рамках одной команды awk , построив большой массив со всеми данными, но если файл очень большой, у вас могут быть проблемы с доступной памятью. Таким образом, я бы сделал это несколькими шагами:

 header=$(awk '{print $1}' file | uniq | tr '\n' ',') printf "${header%?}\n" > output paste -d, <(awk '$1=="Quantity"{print $2}' file) \ <(awk '$1=="Price"{print $2}' file) \ <(awk '$1=="Discount"{print $2}' file) >> output 

Единственная сложная часть здесь – удаление последней запятой в конце заголовка. Для этого я использовал конструкцию ${par%?} .

С perl вы можете так,

 #!/usr/bin/perl use strict; use warnings; my $file=$ARGV[0]; open my $fId, '<', $file or die "Error opeining file <$file>."; my @qty = (); my @price = (); my @discount = (); while(<$fId>){ chomp; my @fields = split (/\t/, $_); push @qty , $fields[1] if $fields[0] =~ m/Quantity/; push @price , $fields[1] if $fields[0] =~ m/Price/; push @discount , $fields[1] if $fields[0] =~ m/Discount/; } close $fId; print "Quantity,Price,Discount\n"; for(my $i = 0; $i < scalar @qty; $i++){ print "$qty[$i],$price[$i],$discount[$i]\n"; } в #!/usr/bin/perl use strict; use warnings; my $file=$ARGV[0]; open my $fId, '<', $file or die "Error opeining file <$file>."; my @qty = (); my @price = (); my @discount = (); while(<$fId>){ chomp; my @fields = split (/\t/, $_); push @qty , $fields[1] if $fields[0] =~ m/Quantity/; push @price , $fields[1] if $fields[0] =~ m/Price/; push @discount , $fields[1] if $fields[0] =~ m/Discount/; } close $fId; print "Quantity,Price,Discount\n"; for(my $i = 0; $i < scalar @qty; $i++){ print "$qty[$i],$price[$i],$discount[$i]\n"; } 

Вам нужно будет передать имя файла в качестве аргумента.

например, ./test.pl input_file

  • Как исключить строки, которые не содержат строку из вывода скрипта awk?
  • Как я могу отфильтровать определенные команды из многострочной истории Bash при выходе из системы?
  • Использование AWK добавляет новую строку, если существует совпадение
  • Помогите улучшить мои навыки AWK
  • Как я могу отредактировать последние n строк в файле?
  • Еще одна синтаксическая ошибка около неожиданного токена `('
  • Обработка двух файлов с помощью awk
  • Примените одно и то же поле из разных записей к операции.
  • Как удалить строки под подзаголовком в файле с помощью команд linux
  • awk не заканчивается
  • POSIX Awk на Solaris 11?
  • Linux и Unix - лучшая ОС в мире.