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 у меня с гулькин х...

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

Подожди, экстрасенсы спят. Проснуться, прочтут, что там тебе надо, тогда начнем думать.

anonymous ()

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

Ну так назови критерий совпадения. Может ты переусложняешь и достаточно грепнуть нужные строки?

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

Критерий совпадения — совпадение.

В основном посте кстати есть ссылка — и здесь тоже непонимание, хотя вроде всё просто — посмотри на файл и на выхлоп bash’а.

Cave-Canem ()
Ответ на: комментарий от anonymous

Мы — это кто? Экстрасенсы + ???

(Всё разжевано и лежит на блюдечке — экстрасенсы могут не беспокоиться).

Cave-Canem ()
Ответ на: комментарий от Cave-Canem

Вряд ли кто-то будет додумывать за тебя, чего ты хочешь.

А объяснять ты или не умеешь или не хочешь.

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

А объяснять ты или не умеешь или не хочешь.

Еще раз по-буквам:

Мне нужно на AWK полную функциональность приведенного выше скрипта, который в файле ищет ВСЕ совпадающие сами с собой ПО ВЫБРАННОМУ ПОЛЮ строки (можно сказать дубликаты ПО ПОЛЮ).

Опять непонятно?

Cave-Canem ()
Последнее исправление: Cave-Canem (всего исправлений: 1)
Ответ на: комментарий от anonymous

Кто не справился с задачкой — правильный ответ:

[code] [ ① ⑤ 9 3 8 ⑤ ① ⑤ 0 ⑤ ] [/code]

Cave-Canem ()
Ответ на: комментарий от anonymous

Ну посмотрите же на приведенный файл и результат наконец!

Троль?

Cave-Canem ()
Ответ на: комментарий от anonymous

Здесь одно поле или десять полей?

Нет! Здесь сферический конь, и он в пальто!

Cave-Canem ()
Последнее исправление: Cave-Canem (всего исправлений: 1)
Ответ на: комментарий от Cave-Canem

Опять непонятно?

Да. Каким образом выбрано поле в примере?

zolden ★★★★★ ()
Ответ на: комментарий от Cave-Canem
  1. фильтр из набора строк входного файла в выходной файл где каждая строка префиксена нужным полем(ТС если в некоторой строке полей меньше то отброс?)

  2. группировка по первому встречному по первому в выходном шага 1

  3. стрипим строки где группа размера 1 и стрипим 1 поле

….

крч.

заводишь ассоциативный массив с индексом по искомому полю куда конкатенируешь с переносом строк входные строки

на конце файла флушиш содержимым асоцмасс без элементов где нет переноса строк.

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

крч. за один проход по файлу используй ассоцмассивы awk

показывай реализацию из предыдущей строки - поможем если баги.

qulinxao3 ()
Ответ на: комментарий от teod0r

вопрос: почему строки с hello, не попали в результат?

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

Потому что:

cat "file" | nl | sort -k 2d
      	
     5	 123 456 789
    14	 Cat washed frame
     6	 Vova drowned
     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
    11	 hello, www!
    18	 hello www!
     1	 hello, y-cat!
     9	 mom at work
     3	 mom washed frame
    12	 petya the Fool
     7	 vova fool
sort --version
sort (GNU coreutils) 5.93
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and Paul Eggert.
gsort --version
sort (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and Paul Eggert.
Cave-Canem ()
Последнее исправление: Cave-Canem (всего исправлений: 1)
Ответ на: комментарий от yoghurt

Так какие поля с чем должны совпадать?

Слово «Дубликаты» знакомо?

Есть файл DSV (TSV), в нем есть поля, разделенные пробелами, выбирается поле (по моему хотению, по моему велению), и ищутся все ДУБЛИКАТЫ внутри этого поля (столбца).

Вопрос: Что совпадает у дубликатов?

Ответ: ВСЁ!

Cave-Canem ()
Ответ на: комментарий от Cave-Canem

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

sort -k 2d

что означает ключ -d?

ps. ты дурак или прикидываешься?

anonymous ()

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

Нет

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

Для начала, описать чётко ТЗ: что делает функция, какую проблему должно решить, что на входе, что ожидается на выходе.

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

что означает ключ -d?

man sort

-d, --dictionary-order

Без -d лучше — теперь всё предсказуемо, не знал об этом.

Тогда выхлоп такой:

     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
    11	 hello, www!
     1	 hello, y-cat!
     9	 mom at work
     3	 mom washed frame

Cave-Canem ()
Ответ на: комментарий от xDShot

описать чётко ТЗ

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

решение без заданного поля - `sort | uniq -D’

Так как sort умеет работать с полями, а uniq не умеет (как бы умеет, но не с полями). То ему надо всего лишь написать на awk uniq -D, умеющий работать с полями. Возможно он еще хочет сортировать на awk.

anonymous ()
Ответ на: комментарий от Cave-Canem

man sort

заодно обрати внимание на то, как выбираются поля

KEYDEF is F[.C][OPTS][,F[.C][OPTS]] for start and stop position

anonymous ()
Ответ на: комментарий от Cave-Canem

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

awk '{if(a[$1]) {c[$1]++; print $0; if(c[$1]==1) {print a[$1]}} a[$1]=$0}' file
anonymous ()
Ответ на: комментарий от Cave-Canem

Так бы и сказал, мне нужно просмотреть CSV файл и видать все дубликаты строк и нумерацию строки в каком-то, заранее неизвестном столбце.

Что сложного в таком описании?

i3wm ()
Ответ на: комментарий от Cave-Canem

Вот без этого текста что там написано в оригинальном посте вообще не понять. Ну по столбцу так по столбцу:

$ cat dup_in.txt
  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!

$ cat dup.awk
{   fields[$COL]++
    if (fields[$COL] == 1) {
        cache[$COL] = $0
    } else {
        if (fields[$COL] == 2) {print cache[$COL]}
        print $0
    }
}

$ awk -f dup.awk -vCOL=2 dup_in.txt | sort
  1 hello, y-cat!
  2 cat drank vodka
  3 mom washed frame
  4 dad drank vodka
  8 cat drank vodka
  9 mom at work
 10 cat whore juvenile
 11 hello, www!
 13 dad washed frame
 15 cat vodka drank
 16 cat drowned
 17 cat the Fool

$ awk -f dup.awk -vCOL=3 dup_in.txt | sort
  2 cat drank vodka
  3 mom washed frame
  4 dad drank vodka
  6 Vova drowned
  8 cat drank vodka
 11 hello, www!
 12 petya the Fool
 13 dad washed frame
 14 Cat washed frame
 16 cat drowned
 17 cat the Fool
 18 hello www!
yoghurt ★★★★★ ()
Ответ на: комментарий от yoghurt

Да, я тут поля на пустоту не проверяю, но пусть уж это будет домашним заданием

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

xDShot

Для начала, описать чётко ТЗ: что делает функция, какую проблему должно решить, что на входе, что ожидается на выходе.

➂ что делает функция,

➃ какую проблему должно решить,

➀ что на входе,

➁ что ожидается на выходе.

========================

➀ На входе (пример):

cat "./file" | nl 
     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!

➁ На выходе (пример):


     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
    11	 hello, www!
     1	 hello, y-cat!
     9	 mom at work
     3	 mom washed frame

➂ Делает:

Выводит на stdout только строки, имеющие дубликаты по заданному (в примере второму) столбцу, не анализируя другие столбцы.

➃ Необходимо:

Переписать код, приведенный в заглавном посте на AWK.

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

проблема решена

Cave-Canem ()
Ответ на: комментарий от anonymous

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

Да, да — я не понимаю, что делает написанный МНОЙ скрипт.

А вот за код ОГРОМНОЕ СПАСИБО, то что нужно.

Проблема решена.

Cave-Canem ()
Ответ на: комментарий от anonymous

Sorry, поторопился

awk '{if(a[$1]) {c[$1]++; print $0; if(c[$1]==1) {print a[$1]}} a[$1]=$0}' file

Так как в AWK не сведущ, объяснить где тут что можете?

??? a[$1] и c[$1] ???

Заранее благодарен!

Cave-Canem ()
Ответ на: комментарий от yoghurt

yoghurt

С AWK

awk --version
awk version 20070501
не работает,
awk: invalid -v option
, а вот с
gawk --version
GNU Awk 5.1.0, API: 3.0
работает, СПАСИБО!

Cave-Canem ()
Ответ на: комментарий от Cave-Canem

Да, да — я не понимаю, что делает написанный МНОЙ скрипт.

Есть Великая теорема Ферма. Она очень просто записывется. Докажи, что она теорема. Покажи что ты понимаешь, что ты написал.

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

Докажи, что она теорема.

Легко:

теорема - это математическое утверждение, истинность которого установлена путём доказательства

Доказана в 1994.

Следовательно Великая теорема Ферма — теорема.

Покажи что ты понимаешь, что ты написал.

Спрашивай — отвечу.

Вкратце:

Файл передается в массив (элементы —строки), индексация начинается с 1.

Инициализируются счетчик и флаг.

Скользящим окном размером 2 строки просматривается массив, с помощью AWK в два временных массива (fr — first record, sr — second record) сохраняется информация о выбранном поле ($2) и о всей записи ($0) для этих двух строк.

При совпадении полей ( if [[ «${fr[0]}» == «${sr[0]}» ]] ) — они печатаются и устанавливается флаг. При несовпадении просто сбрасывается флаг.

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

Достаточно?

Cave-Canem ()
Ответ на: комментарий от Cave-Canem

теорема

Доказана в 1994.

Кем доказана - тобой? Или ты принял на веру? То есть ты не понимаешь, ты веришь?

Покажи что ты понимаешь, что ты написал.

Спрашивай — отвечу.

Ты же «понимал», когда писал sort -k 2d. Или нет?

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

Кем доказана - тобой? Или ты принял на веру? То есть ты не понимаешь, ты веришь?

Не понимаю что?

Что она доказана?

Я, естественно, доказать теорему Ферма не могу (и ты не можешь), как не могу делать еще миллиард вещей (которые не можешь делать и ты).

Что примером с теоремой Ферма сказать хотел?

Ты же «понимал», когда писал sort -k 2d. Или нет?

anonymous, «понимание» имеет разные степени, n'est-ce pas?

Cave-Canem ()
Ответ на: комментарий от Cave-Canem

«понимание» имеет разные степени

Твоя «степень понимания» - это вера, да будет так, аминь!

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

Твоя «степень понимания» - это вера, да будет так, аминь!

Какая-то дурная игра в слова.

Причем здесь «вера»?

Можно понимать, можно не понимать, можно понимать неправильно, можно понимать одну часть и не понимать другую, можно заблуждаться — это не имеет никакого отношения к «вере» — если я правильно понимаю русский язык.

Вернемся к нашим овечкам.

Мой скрипт делает ровно то, что я и хотел.

Покажи что ты понимаешь, что ты написал.

Напиши строчку с любым текстом и ПОКАЖИ что ты понимаешь, что написал.

(есть такая детская забава — а ты докажи...)

anonimus, ты очевидно не понимаешь, что «ПОНИМАНИЕ» —это ПРОЦЕСС.

P.S.

Вы автор? Объяснить сможете?

Cave-Canem ()
Последнее исправление: Cave-Canem (всего исправлений: 1)
Ответ на: комментарий от Cave-Canem

Мой скрипт делает ровно то, что я и хотел.

И куда же твой скрипт потерял

  1 hello, y-cat!
 11 hello, www!

?

Напиши строчку с любым текстом и ПОКАЖИ что ты понимаешь, что написал.

Я не утверждал, что понимаю всё, что пишу.

«ПОНИМАНИЕ» —это ПРОЦЕСС.

Важное замечание: это процесс, который останавливается. И тут выскакивает так называемая «проблема останова».

Вы автор? Объяснить сможете?

Нет. Но я могу написать скрипт аналог uniq -D без использования массивов, (естественно для предварительно сортированных строк, что скажется на большом количестве строк).

anonymous ()

Я ж тебе в той теме вариант на awk уже написал AWK — Вывести все строки, совпадающие по полю $n (комментарий) тут его ещё три раза реализовали с незначительными изменениями.

awk простой язык, стот только понять его концепцию шаблонов. И не писать на нём в одну строку.

PS да, тут сайт про операционную систему GNU/Linux и это значит что мы по умолчанию и без лишних уточнений используем гнутую реализацию awk.

legolegs ★★★★★ ()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от anonymous

anonimus,

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

Мой скрипт ничего не потерял, просто sort c опцией -d работает в «словарном порядке», что (как выяснилось) соответствует consider only blanks and alphanumeric characters, иначе говоря мое «знание» было неполным.

Я не утверждал, что понимаю всё, что пишу.

Опять дурацкая игра в слова с привлечением ∀ — любимой штучки демагогов.

Важное замечание: это процесс, который останавливается. И тут выскакивает так называемая «проблема останова».

Деточка, понимание — операция мышления, ПРОЦЕССА принципиально не алгоритмизируемого, во-первых, а во-вторых т.к. реальность изменчива и дана нам фрагментарно, ПРОЦЕСС ПОНИМАНИЯ чего бы то ни было требует постоянной «достройки».

У вас русский язык родной?

Вы «понимание» и «знание» различаете?

Вам понятна фраза: «Так как я не знал этого факта, моё понимание происходящего было неверным, в результате чего мои действия привели пациента к летальному исходу »?

А теперь снова перечитайте этот комментарий.

Нет.

К чему относится «Нет»? К авторству или объяснению?

Но я могу написать скрипт аналог uniq -D

Ну вот и напишите.

Cave-Canem ()
Последнее исправление: Cave-Canem (всего исправлений: 1)
Ответ на: комментарий от legolegs

legolegs

awk простой язык, стот только понять его концепцию шаблонов.

Что-то не могу въехать. Что значит например foo{$1}++ ? Как это работает? Может посоветуете толковую лит-ру (жел на русском)?

PS да, тут сайт про операционную систему GNU/Linux

uname -sm
Darwin x86_64

полностью POSIX сертифицирована.

Cave-Canem ()
Последнее исправление: Cave-Canem (всего исправлений: 1)
Ответ на: комментарий от Cave-Canem

иначе говоря мое «знание» было неполным

То «знание», то «понимание». Кто тут играет словами?

Знание - это как бы факты и «логические» выводы на основе этих фактов. Это отражение реальности.

Понимание - это тот самый «логический» вывод на основе знаний. А знание - это, как уже сказано, отражение реальности.

В случае с sort -d у тебя не «неполные знания», у тебя «неправильные знания», неправильное отражение реальности.

На основе неправильных знаний, ты не построишь правильные выводы. У тебя будет неправильное понимание, или одним словом - непонимание. У тебя непонимание.

Опять дурацкая игра в слова с привлечением ∀ — любимой штучки демагогов.

Это ты предложил такую игру - написать любой бред и понять этот бред. Любимая штучка демагога.

Остальной бред про «знание», «понимание», «процесс мышления» пропущу. Так как у нас разная аксиоматика.

К чему относится «Нет»? К авторству или объяснению?

И к авторству и объяснению.

Ну вот и напишите.

Нет, не напишу.

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

Ты:

Это ты предложил такую игру - написать любой бред и понять этот бред.

Я:

Напиши строчку с любым текстом и ПОКАЖИ что ты понимаешь, что написал.

Раз. Передёрг —я не предлагал писать бред.

Два. Я не предлагал что-либо понять.

Три. В тексте ЗАГЛАВЫМИ буквами поставлен акцент — ПОКАЗАТЬ что понимаешь

Я:

(есть такая детская забава — а ты докажи...)

Смысл забавы сводится к:

Уайт играет с позиции доминирования и его стратегия основана на том, что большинство людей чувствуют, что должны вести себя «логично» и «правдиво». Доминирующий игрок требует от подчиненного игрока логически обосновать его позицию. Если подчиненный игрок принимает требо­вание – он проиграл. Каждый аргумент отметается. Если аргументация нелогична, доминирующий игрок указы­вает на это. Если аргументация логична, доминирующий игрок меняет тему разговора с помощью болтовни и ри­торических трюков. Обычно более слабому игроку тре­буются часы, если не дни, чтобы увидеть слабость аргу­ментов более сильного игрока, но тогда уже слишком поздно.

Есть Великая теорема Ферма. Она очень просто записывется. Докажи, что она теорема. Покажи что ты понимаешь, что ты написал.

Зачем это написано? С какой целью? Подтвердить авторство?

Что значит «покажи»? Объяснить как работает скрипт?

Я это сделал.

Ты:

Но я могу написать скрипт аналог uniq -D

Ты:

Нет, не напишу.

Комметов написано куча, информативных — 0

Так как у нас разная аксиоматика.

Вот и договорились.

P.S. У нас еще и разные представления о адекватной социальным нормам межличностной коммуникации.

Cave-Canem ()
Ответ на: комментарий от Cave-Canem

Напиши строчку с любым текстом и ПОКАЖИ что ты понимаешь, что написал.

Это что? Признание того, что ты не понимаешь, что пишешь?

Чтобы показать, что понимаешь, надо сперва понимать, а потом показать свое понимание. Мне надо сперва понять «строчку с любым текстом». «Строчка с любым текстом» - это «любой бред».

Есть Великая теорема Ферма.

Зачем это написано? С какой целью? Подтвердить авторство?

Ты вообще потерял нить обсуждения.

Это было написано на твое утверждение, что ты понимаешь свой баш-скрипт. А сам сразу посыпался на ‘sort -k 2d’, во-первых. Откуда ты вытащил -d, да еще вставил так, что сразу не поймешь к чему там этот d? Во-вторых, фактически твой скрипт не делает, то что ты описал словами, а именно куда потерялись строки с cat,? Твое понимание не стыкуется с реальностью.

Комметов написано куча, информативных — 0

Что на счет sort -d и проигнорированный тобой комент про sort -k $N,$N, чтобы сортировать только по полю $N (start=$N, end=$N), а не начиная с поля $N до конца строки?

У нас еще и разные представления о адекватной социальным нормам межличностной коммуникации.

А ты можешь в «строчки с любым текстом». Показывай, что ты понимаешь :)

anonymous ()
Ответ на: комментарий от Cave-Canem

Что значит например foo{$1}++ ? Как это работает?

В языке awk такой конструкции нет.

Может посоветуете толковую лит-ру?

man awk

(жел на русском)?

Первая ссылка в яндексе по запросу «man awk»: https://www.opennet.ru/man.shtml?topic=awk&category=1 Стоило бы уделить время азам, в свободное от пустых споров с аноном время.

Darwin

Не относится к тематике linux.org.ru или opensource.ru

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

legolegs В языке awk такой конструкции нет.

Виноват, экранчик у меня маленький, а зрение ни к черту (+6), должно было быть написано foo[$1]++

Как это работает?

Стоило бы уделить время азам, в свободное от пустых споров с аноном время.

А и правда ваша. Ну его к лешему. Пусть развлекается еще за чей-нибудь счет.

Не относится к тематике linux.org.ru или opensource.ru

Да я и не настаиваю, и в чужой монастырь со своим уставом не лезу, написал просто что бы представиться.

P.S. man'ы смотрел —этого явно недостаточно. Перелопатил кучу руководств, но въехать в работу например с массивами не сумел.

Cave-Canem ()
Последнее исправление: Cave-Canem (всего исправлений: 1)
Ответ на: комментарий от Cave-Canem

foo[$1]++

элемент массива foo с индексом равным $1 увеличиваем на единицу. Это так работает примерно во всех используемых сегодня языках.

legolegs ★★★★★ ()
Ответ на: комментарий от Cave-Canem

ну блин грусно ( аж прям marching morons) - по awk эталонное

https://en.wikipedia.org/wiki/The_AWK_Programming_Language

глава(али параграф) про массивы - они в авке хэши/словари в терминах языков различающих индексы по числу и индексы по строке али ваще индексы по литералу-обьекта

на репите-рапиде:

для каждой строки входного файла напихиваешь(пушишь с разделителями пушимого) по индексу поля в ассоц. массив сию строку

на завершении флушиш сей массив в виде нужном(тут возможно некая пост обработка) -

ззы.

учитывая время нерешённости сей задачки -

по мнению того медведя из того анекдота - "«а ты точно охотник?»

qulinxao3 ()
#!/bin/sh

# usage: sh thisscript column# filename

awk -v f=$1 '
BEGIN { split("",c); split("",l); }
{ if (!c[$f]++) l[$f] = $0; }
c[$f] == 2 { print l[$f]; }
c[$f] > 1 { print; }
' $2

Объяснять влом.

Для нумерованного исходника при «2 sourcefile» выдаёт:

  2 cat drank vodka
  8 cat drank vodka
  3 mom washed frame
  9 mom at work
 10 cat whore juvenile
  1 hello, y-cat!
 11 hello, www!
  4 dad drank vodka
 13 dad washed frame
 15 cat vodka drank
 16 cat drowned
 17 cat the Fool

При «3 sourcefile» выдаёт:

  2 cat drank vodka
  4 dad drank vodka
  8 cat drank vodka
  3 mom washed frame
 13 dad washed frame
 14 Cat washed frame
  6 Vova drowned
 16 cat drowned
 12 petya the Fool
 17 cat the Fool
 11 hello, www!
 18 hello www!

При «4 sourcefile» уже начинаются приколы:

  2 cat drank vodka
  4 dad drank vodka
  1 hello, y-cat!
  6 Vova drowned
  7 vova fool
  8 cat drank vodka
 11 hello, www!
  3 mom washed frame
 13 dad washed frame
 14 Cat washed frame
 16 cat drowned
 12 petya the Fool
 17 cat the Fool
 18 hello www!

– тому що в некоторых строках только 3 поля.

berrywizard ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.