Оставлять самую длинную строку только при дублировании первого столбца

Это - вид частичного ответа, так как я не пользователь Мяты или Корицы.

Общий вид GUI в Linux главным образом определяется двумя вещами:

  1. Тема библиотеки виджета (иначе. инструментарий), который является обычно, прежде всего, GTK. "Прежде всего", потому что на самом деле инструментарий, используемый приложением, определяется самим приложением, но наиболее распространенный является GTK. DE (настольная среда) включает набор собственных приложений, и они будут все использовать тот же инструментарий; Корица является GTK базирующийся DE. Однако имейте в виду, что возможно запустить приложения, которые не используют GTK, в этом случае, они не будут, вероятно, соответствовать теме.

    Библиотека виджета - то, что ответственно за материал в границах окна. Существуют различные способы изменить это, DE's будет включать один (который Вы очевидно нашли).

  2. Тема используется менеджером окон. Менеджер окон является слоем под DE, и он определяет, как окна смотрят и ведут себя. Они используют темы также, но они не связаны с любой темой виджета. В отличие от инструментария виджета, окно не определяется на приложение, и таким образом, граница, строка заголовка, и т.д. появится то же независимо.

DE's обычно имеет способ изменить тему менеджера окон также, но это, вероятно, будет отдельным от темы виджета. На KDE, например, № 1 является "Тема для рабочего стола", и № 2 является "Художественными оформлениями Окна". Таким образом, Вы хотите искать различие того вида; быстрый поиск онлайн "коричной темы окна изменения Linux Mint" поднял это, которое упоминает границы окна, и т.д., в отличие от темы GTK.

2
14.10.2015, 10:20
4 ответа
user@machine:~/tmp$ cat f1
'ST30074650'    'someone1@foo.com'  '2015-10-17 10:00'
'ST30085367'    'someone2@foo.com'  '2015-10-18 13:00'
'ST30086369'        '2015-10-17 13:00'
'ST30115016'    'someone3@foo.com'  '2015-10-18 13:00'
'ST30124587'        '2015-10-18 09:00'
'ST30123591'        '2015-10-18 09:00'
'ST30074650'        '2015-10-17 10:00'

user@machine:~/tmp$ sort -r f1 |uniq -w 12 |sort
'ST30074650'    'someone1@foo.com'  '2015-10-17 10:00'
'ST30085367'    'someone2@foo.com'  '2015-10-18 13:00'
'ST30086369'        '2015-10-17 13:00'
'ST30115016'    'someone3@foo.com'  '2015-10-18 13:00'
'ST30123591'        '2015-10-18 09:00'
'ST30124587'        '2015-10-18 09:00'
  • Первая сортировка в обратном порядке по всей строке, чтобы получить сначала более длинные строки
  • uniq проверяет только первые 12 символов, сохраняет первую (более длинную) строку, сравнивая только 12 символов
  • опциональная финальная сортировка для получения естественного порядка
2
27.01.2020, 21:51

Я не понимаю, при чем тут SOMEMAGIC

попробуйте этот файл awk

{ if ( $1 in a ) {
     if ( length(a[$1]) < length($0)) a[$1]=$0 ;
            } # $1 in a
  else  a[$1]=$0 ; }

END { for ( b in a ) {print a[b] ;}  }

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

... egrep -w "${SAT}|${SUN}" | awk -f u.awk | sort
3
27.01.2020, 21:51

Использование однострочника perl:

perl -a -e '$line{$F[0]} = $_ if (length($_) > length($line{$F[0]})) ; END { foreach (sort keys %line) { print $line{$_} } };'  STs.csv STt.csv

Или, в более простой для чтения форме автономного скрипта Perl:

#! /usr/bin/perl -a

$line{$F[0]} = $_ if (length($_) > length($line{$F[0]})) ;

END {
  foreach (sort keys %line) { print $line{$_} }
};

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

3
27.01.2020, 21:51

рефакторинг вашего кода (непроверенный из-за отсутствия исходных входных данных)

awk -F '^' -v OFS='\t' \
           -v sat=$(date -d saturday +%F) \
           -v sun=$(date -d sunday +%F) \
'
    $6 !~ "^"sat && $6 !~ "^"sun {next}
    { line = $1 OFS $3 OFS $6 }
    length(line) > lines[$1] {lines[$1] = line}
    END { for (key in lines) print lines[key] }
' STs.csv STt.csv | sort

В GNU awk вы можете опустить завершающую сортировку , используя

    END { 
        PROCINFO["sorted_in"] = "@ind_str_asc"
        for (key in lines) print lines[key] 
    }
0
27.01.2020, 21:51

Теги

Похожие вопросы