LINUX.ORG.RU
ФорумAdmin

Мне нужно на AWK то, ...

 


2

1

что делает на скорую руку написанная фигня на Bash'е:

(вывод ТОЛЬКО совпадающих по ЗАДАННОМУ полю строк)

(продолжение темы)

Файл (добавлена нумерация для наглядности):

  1 hello, y-cat!
  2 cat drank vodka
  3 mom washed frame
  4 dad drank vodka
  5 123 456 789
  6 Vova drowned
  7 vova fool
  8 cat drank vodka
  9 mom at work
 10 cat whore juvenile
 11 hello, www!
 12 petya the Fool
 13 dad washed frame
 14 Cat washed frame
 15 cat vodka drank
 16 cat drowned
 17 cat the Fool
 18 hello www!
Код:
#!/usr/bin/env bash

mapfile -O 1 a < <(cat "file" | nl | sort -k 2d)

i=0
f=0
for str in "${a[@]}"; do		
	
	(( i++ ))
	mapfile fr < <(printf %s "${a[i]}" | awk '{print $2"\n"$0}')
	mapfile sr < <(printf %s "${a[i+1]}" | awk '{print $2"\n"$0}')
		
	if [[ "${fr[0]}" == "${sr[0]}" ]]; then
		if (( f == 0 )); then
			f=1
			printf %s "${fr[1]}"
			printf %s "${sr[1]}"
		else
			printf %s "${sr[1]}"
		fi
	else
		f=0
	fi
done
Выхлоп:
      2 cat drank vodka
      8 cat drank vodka
     16 cat drowned
     17 cat the Fool
     15 cat vodka drank
     10 cat whore juvenile
      4 dad drank vodka
     13 dad washed frame
      9 mom at work
      3 mom washed frame

(Проблему с сортировкой заметили?)

Дальше

awk 'BEGIN {i = 1} {ff = $1; f_l = $0; getline ; sf = $1; s_l = $0} {if (ff == sf) a[i] = f_l; a[i+1] = s_l; i = i +2 } END { (for i in a) print a[i]} ' file
не продвинулся, я уже писал, что опыта с AWK у меня с гулькин х...

Грамотные, подскажите КАК?



Последнее исправление: Cave-Canem (всего исправлений: 3)
Ответ на: комментарий от berrywizard
{ if (!c[$f]++) l[$f] = $0; }

красивше переписать как

!c[$f]++ { l[$f] = $0; }
berrywizard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.