LINUX.ORG.RU

Массивы в awk

 , ,


0

1

Люди добрые, помогите. Являюсь новичком, сейчас изучаю awk. Не могу разобраться со след проблемой. Имеется текст c 5 строками:

2 second row
5 fifth row
3 third row
1 first row
4 fourth row

Идея след:
Нужно создать скрипт, который отсортирует строки по их порядковым номерам тем самым формируя массив, индексами которых будут номера строк. После, напечатать строки в порядке их номеров. Буду благодарен за ответ.



Последнее исправление: xaizek (всего исправлений: 3)

Массивы в awk ассоциативные (hash), поэтому после его заполнения, нужно будет получить список ключей (индексов), их отсортировать и затем вывести значения массива по ключам.

Это сложно, значительно проще исп. sort, но если это у тебя домашка, то ты ошибся форумом

futurama ★★★★★
()

Что в тэгах делает bash?

dexpl ★★★★★
()
sort -n | awk '{$1=''; print substr($0,2);}'

либо в awk записать в массив используя $1 как индекс ( а что делать с дублями?). Запомнить максимальный индекс, а дальше в цикле вывести все существующие элементы массива от 0 до максимального значения.

У awk есть замечательные правило «END» которое выполняется после EOF.

awk '{A[$1]=$0;if($1<M)M=$1;}END{for(i=0;i<=M;i++)if(A[i]!="")print(A[i]);}

В этом коде есть ошибка.

vel ★★★★★
()
Ответ на: комментарий от vel

Блин, спасибо тебе большое, выручил. Скопировал твой скрипт и чуть подстроил под себя:

#!/bin/bash { if ($1 > max) max = $1 array[$1] = $0 } END { for (x = 1; x <= max; x++) if (x in array)
print array[x] }

Результат: 1 first row 2 second row 3 third row 4 fourth row 5 fifth row

Orzu1998
() автор топика
Ответ на: комментарий от vel

if(A[i]!="")…

if (i in A) …

Дарю

awk ' {A[$1]=$0}; 
  END {M=asorti(A, B, "@ind_num_asc")
       for(i=1;i<=M;i++) 
          print(A[B[i]])
  }'
futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.