LINUX.ORG.RU

Нужно готовое решение, а не отсылки

Ну хоть потуги свои выложил бы, а то совсем уж толсто получилось

DllMain
()

Совпадающие с чем?

Что именно у тебя не получается?

Покажи пример ввода и вывода.

legolegs ★★★★★
()

Нужно готовое решение, а не отсылки.

Озвучь нормально ТЗ и скажи, какой у тебя бюджет.

DELIRIUM ☆☆☆☆☆
()
Ответ на: DllMain: от Cave-Canem
$ cat lab1.awk
#!/usr/bin/awk -f

{ result[$3] = result[$3] "\n" $0 }

END {
	for (i in result) {
		print("*** " i ":" result[i])
	}
}
$ echo -e '1 2 3 4 5\n3 8 3 0\n0 3 9 0' | ./lab1.awk 
*** 3:
1 2 3 4 5
3 8 3 0
*** 9:
0 3 9 0 
DllMain
()
Ответ на: DELIRIUM: от Cave-Canem

Бюджет: $0.00

Ну ищи строки, чо.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DllMain

DllMain:

Спасибо, но не совсем то, точнее совсем не то:

Нужно вывести только совпадающие строи, а не весь файл:

port -v installed | /Users/xxx/Desktop/TMP/awk_1.sh | nl
653	*** p5.28-sub-uplevel:
   654	  p5.28-sub-uplevel @0.280.0_0 (active) platform='darwin 13' archs='noarch' date='2020-02-25T23:48:39+0300'
   655	*** netpbm:
   656	  netpbm @10.90.01_0+x11 (active) platform='darwin 13' archs='x86_64' date='2020-05-02T01:56:45+0300'
   657	*** ld64-latest:
   658	  ld64-latest @450.3_0+llvm37 platform='darwin 13' archs='x86_64' date='2020-04-04T04:41:08+0300'
   659	  ld64-latest @450.3_0+llvmdev platform='darwin 13' archs='x86_64' date='2020-04-04T21:52:41+0300'
   660	  ld64-latest @450.3_0+llvm50 platform='darwin 13' archs='x86_64' date='2020-04-06T16:58:36+0300'
   661	  ld64-latest @450.3_0+llvm90 (active) platform='darwin 13' archs='x86_64' date='2020-04-03T13:18:58+0300'
   662	*** py37-pygments:
   663	  py37-pygments @2.6.1_0 (active) platform='darwin 13' archs='noarch' date='2020-03-18T11:23:39+0300'   

Иначе говоря, нужны только строки с 658 по 661.

(Я же писал, что опыта у меня мало).

Cave-Canem
() автор топика

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

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

anonymous

На входе: Выхлоп команды вида:

cairo @1.16.0_0+quartz+x11 (active) platform='darwin 13' archs='x86_64' date='2020-02-25T23:38:12+0300'
  ccache @3.7.9_0 (active) platform='darwin 13' archs='x86_64' date='2020-03-31T14:09:02+0300'
  cctools @927.0.2_3+llvm37 platform='darwin 13' archs='x86_64' date='2020-04-18T05:43:36+0300'
  cctools @927.0.2_3+llvm50 platform='darwin 13' archs='x86_64' date='2020-04-22T22:35:39+0300'
  cctools @927.0.2_3+llvm90 (active) platform='darwin 13' archs='x86_64' date='2020-04-16T07:16:36+0300'
  clang-3.7 @3.7.1_6+analyzer (active) platform='darwin 13' archs='x86_64' date='2020-04-04T03:52:29+0300'
  clang-5.0 @5.0.2_4+analyzer+defaultlibcxx+libstdcxx (active) platform='darwin 13' archs='x86_64' date='2020-02-25T19:45:21+0300'
  clang-9.0 @9.0.1_0+analyzer+libstdcxx (active) platform='darwin 13' archs='x86_64' date='2020-04-11T01:31:00+0300'
  clang-10 @10.0.0_0+analyzer+libstdcxx (active) platform='darwin 13' archs='x86_64' date='2020-04-28T05:10:51+0300'

Хочу: Вывести только совпадающие по первому полю строки (по первому полю взято для примера), иначе говоря только строки начинающиеся с «cctools» Файл может быть не отсортирован, как на примере выше, а отсортирован по последнему полю (например).

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

А что если вы входе

cctools
cctools
cctools
ld64-latest
ld64-latest

что тогда выводить? cctools или ld64-latest?

legolegs ★★★★★
()

Тебе надо вывести строки с неуникальными словами во втором поле?

<test.txt awk '
$2 in names {
  if(lines[$2]) {
    print lines[$2];
    delete lines[$2];
  }
  print
}
{
  if (names[$2]++==0)
    lines[$2]=$0;
}
'

для файла test.txt такого:

     1  *** ld64-latest:
     2  ld64-latest aaaaaa
     3  ld64-latest bbbbb
     4  ld64-latest ccccc
     5  *** py37-pygments:
     6  py37-pygments aaaa
     7  cairo aaaa
     8  cctools aaaaa
     9  cctools bbbbb
    10  cctools cccccc
    11  clang-3.7 aaa
    12  clang-5.0 aaaaa
    13  clang-9.0 aaaaaaa

получается такой вывод:

     2  ld64-latest aaaaaa
     3  ld64-latest bbbbb
     4  ld64-latest ccccc
     1  *** ld64-latest:
     5  *** py37-pygments:
     8  cctools aaaaa
     9  cctools bbbbb
    10  cctools cccccc

строки со звёздочками и прочий мусор сам как-нибудь отфильтруешь, можно прямо в awk дописать в начале шаблон с /\*\*\*/ {next;}

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

anonymous

В это случае вот всё это и вывести:

cctools @927.0.2_3+llvm37 platform='darwin 13' archs='x86_64' date='2020-04-18T05:43:36+0300'
cctools @927.0.2_3+llvm50 platform='darwin 13' archs='x86_64' date='2020-04-22T22:35:39+0300'
cctools @927.0.2_3+llvm90 (active) platform='darwin 13' archs='x86_64' date='2020-04-16T07:16:36+0300'
ld64-latest @450.3_0+llvm37 platform='darwin 13' archs='x86_64' date='2020-04-04T04:41:08+0300'
ld64-latest @450.3_0+llvmdev platform='darwin 13' archs='x86_64' date='2020-04-04T21:52:41+0300'
ld64-latest @450.3_0+llvm50 platform='darwin 13' archs='x86_64' date='2020-04-06T16:58:36+0300'
ld64-latest @450.3_0+llvm90 (active) platform='darwin 13' archs='x86_64' date='2020-04-03T13:18:58+0300'

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

anonymous

Тебе надо вывести строки с неуникальными словами во втором поле?

Нет. Мне нужно вывести все строки, у которых заданные (например $2) поля совпадают, не интересуясь ничем больше.

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

заданные (например $2) поля совпадают

$x == "test" { print $0 }

Правда, всё ещё непонятно, чего вы пытаетесь добиться.

gedisdone ★★★
()

сформулируй код хоть словами - т.е сформулируй алго которое тебе нужно.

любой кто может awk

описанный тобой алго.

тут же отранслирует тебе в ответном посте.

пока ваще не вполне ясно какого рода совпадения(аля группировка) есть критерий искомого тобой фильтра.

qulinxao3 ★★
()

awk '$3 == "something" {print}', или что надо то? Если нужно матчить регекс, то ~ вместо ==.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

(Лучше бы для неотсортированного файла).

И в чём проблема просто бахнуть в пайплайн sort? Сильно упростит задачу.

Если фильтровать надо не по первой колонке — у sort есть ключик -k, ознакомьтесь.

|sort|awk 'BEGIN { ll=0 } pc == $1 || ll == 1 { print pl; ll=1 } pc != $1 { ll=0 } {pl=$0; pc=$1}'

mertvoprog
()
Ответ на: anonymous от Cave-Canem

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

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

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

Гнутый поддерживает. Я ХМЛ на нём парсил, так то!

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

Отлично, предложите тогда регулярку, учитывающую кавычки?

(active), допустим, можно просто sed-ом вырезать, если он не нужен…

mertvoprog
()

Вам нужен grep через AWK?

Example file with name test:

cairo @1.16.0_0+quartz+x11 (active) platform='darwin 13' archs='x86_64' date='2020-02-25T23:38:12+0300'
  ccache @3.7.9_0 (active) platform='darwin 13' archs='x86_64' date='2020-03-31T14:09:02+0300'
  cctools @927.0.2_3+llvm37 platform='darwin 13' archs='x86_64' date='2020-04-18T05:43:36+0300'
  cctools @927.0.2_3+llvm50 platform='darwin 13' archs='x86_64' date='2020-04-22T22:35:39+0300'
  cctools @927.0.2_3+llvm90 (active) platform='darwin 13' archs='x86_64' date='2020-04-16T07:16:36+0300'
  clang-3.7 @3.7.1_6+analyzer (active) platform='darwin 13' archs='x86_64' date='2020-04-04T03:52:29+0300'
  clang-5.0 @5.0.2_4+analyzer+defaultlibcxx+libstdcxx (active) platform='darwin 13' archs='x86_64' date='2020-02-25T19:45:21+0300'
  clang-9.0 @9.0.1_0+analyzer+libstdcxx (active) platform='darwin 13' archs='x86_64' date='2020-04-11T01:31:00+0300'
  clang-10 @10.0.0_0+analyzer+libstdcxx (active) platform='darwin 13' archs='x86_64' date='2020-04-28T05:10:51+0300'

Command: awk '/cctools/' < test

Example output:

  cctools @927.0.2_3+llvm37 platform='darwin 13' archs='x86_64' date='2020-04-18T05:43:36+0300'
  cctools @927.0.2_3+llvm50 platform='darwin 13' archs='x86_64' date='2020-04-22T22:35:39+0300'
  cctools @927.0.2_3+llvm90 (active) platform='darwin 13' archs='x86_64' date='2020-04-16T07:16:36+0300'

Если нужно пропустить пробелы в начале строки - пишем:
awk '/^[[:space:]]*cctools/' < test

Соот-нно:
awk - по ТЗ
'/ ... /' -> синтаксис awk
'/^ ... '/ -> ^ обозначает начало строки.
'/^[[:space:]]* ... /' -> [[:space:]]* пропускаем пробелы в начале строки.
'/^[[:space:]]*cctools/' -> cctools ищем вхождение в начале строки а не в середине строки.

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

А должен быть? У sort от такого ключика задача не меняется: просто задаётся критерий для сортировки. У uniq же получится другая задача: вместо дедупликации — фильтрация. А для задачи фильтрации в coreutils предназначен grep.

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

У uniq есть –skip-fields=N –skip-chars=N –check-chars=N, то есть какая-то попытка работать не с записями целиком, а с отдельными полями в них была предпринята. Но не до конца.

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