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

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

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 или sed
  • Awk: сопоставить точную строку в строке
  • Почему число округлено по ssh?
  • Как извлечь одно значение из однострочных кортежей?
  • Как удалить текст, сопоставляющий определенные шаблоны из файла
  • Соответствие IP-адреса в указанном диапазоне с помощью awk
  • команда | grep | awk | ... как выполнить
  • Не удалось запустить awk-программу
  • Как получить значение последнего дня в текущем месяце в awk
  • Еще одна синтаксическая ошибка около неожиданного токена `('
  • Interesting Posts

    Включить «kvm = off», «x-vga = on» и «-vga = none» из Virt-Manager?

    Какой «правильный» формат для переменной среды HTTP_PROXY? Колпаки или колпачки?

    GNU-компоновщик, создающий бесполезное расстояние между разделами в файле ELF

    Ethernet через USB (g_ether) автоматически (повторно) подключается

    печать цветного текста с использованием эха

    загружать и загружать файлы с сервера без указания пароля

    Моделирование активности пользователей

    dpkg: error: невозможно удалить архитектуру «i386», используемую в настоящее время базой данных

    Кажется, что chown разрешено не root-пользователю

    Преобразование любого формата даты в unix

    Сброс многоадресного потока UDP с помощью socat

    Дублировать и отправлять исходящие UDP-пакеты через два интерфейса, ориентированные на Интернет.

    разрешение pure-ftpd запрещено на внешнем USB-накопителе

    Wi-Fi работает на местном, без подключения к Интернету. Дебайн 7

    изменить среду работающего процесса

    Linux и Unix - лучшая ОС в мире.