таращите глаза присоединяются к двум TSV столбцами (a'la sql соединение)

Этим управляют interpreter-mode-alist. В моем Emacs (23.2.1 на Debian), существует запись для ruby1.9 из поля. Я предполагаю, что у Вас есть более старая версия; можно добавить это к Вашему .emacs:

(add-to-list 'interpreter-mode-alist
             '("ruby1.9" . ruby-mode))

2
13.04.2017, 15:36
4 ответа

Это появляется join команда может только присоединиться на одном поле [1,2], таким образом:

awk '
    BEGIN {FS=OFS="\t"}
    NR==FNR {a[$1 FS $3] = $2 FS $4; next}
    $1 FS $2 in a {print a[$1 FS $2], $3}
' a.tsv b.tsv

Обновление, должное прокомментировать: так как данный ключ не уникален, вот техника для создания многократных въездов от "a.tsv"

awk '
    BEGIN {FS=OFS="\t"}
    NR==FNR {
        key = $1 FS $3
        if (key in a)
            a[key] = a[key] "\n" $2 FS $4
        else
            a[key] = $2 FS $4
        next
    }
    $1 FS $2 in a {
        split(a[$1 FS $2], ary, /\n/)
        for (idx in ary)
            print ary[idx], $3
    }
' a.tsv b.tsv
6
27.01.2020, 21:49
  • 1
    @glenn_jackman я не был достаточно ясен. Позвольте мне быть более конкретным: существует два файла, но их имена файлов могут быть зафиксированы в исходном коде :). –  Grzegorz Wierzowiecki 24.10.2011, 17:59
  • 2
    @glenn_jackman: Это - записи пропусков с дублирующимися ключами a.tsv. Это только сохраняет считанный в последний раз в массиве... –  Peter.O 24.10.2011, 21:58
  • 3
    @GrzegorzWierzowiecki, обновленный ответ, проверяет его. –  glenn jackman 24.10.2011, 23:45
  • 4
    @glennjackman, спасибо за указание на проблему уникальности :). –  Grzegorz Wierzowiecki 25.10.2011, 11:27

Я разделил задачу к двум различным программам:

  1. Используйте соединение (1) для присоединения к этим двум файлам

  2. awk (1) или сокращение (1) для разделения нежелательных столбцов

3
27.01.2020, 21:49
  • 1
    СОЕДИНЕНИЕ является интересной частью. Второй - вырезание, ясно мне. соединение –  Grzegorz Wierzowiecki 24.10.2011, 15:51
  • 2
  • 3
    В случае, если я не заявил что достаточно ясно: существует названная команда UNIX join который можно использовать для той задачи. –  ktf 24.10.2011, 15:58
  • 4
    Спасибо, ktf, я не имею, знал прежде о join команда, таким образом, я неправильно понял "соединение" с оператором вопроса. По моему скромному мнению, Вы были правы, и показанные ясно, что Вы имеете в виду команду со скобками, ссылаясь к странице справочника - это было мое недооцененное. Еще раз спасибо :D. –  Grzegorz Wierzowiecki 28.10.2011, 10:40

Я не знаю awk очень хорошо, но это было специально разработано для обработки полей в текстовых файлах, таким образом, я предполагаю, что это может сделать задание вполне хорошо, но потому что Вы, казалось (?), выразили интерес к join (в комментариях ktf), вот решение с помощью стандартных инструментов Unix: join и cut и paste и sort - много "ands", но это работает, и это могло бы служить примером почему awk лучше :)... У меня есть thown это в главным образом для затем фактора сравнения методов.

join -t $'\t' -o 1.2 1.3  2.2  \
 <(paste <(paste <(cut -f1 a.tsv) \
                 <(cut -f3 a.tsv) \
                 | tr '\t' '\0' ) \
         <(cut -f2 a.tsv) \
         <(cut -f4 a.tsv) \
         | sort ) \
 <(paste <(paste <(cut -f1 b.tsv) \
                 <(cut -f2 b.tsv) \
                 | tr '\t' '\0' ) \
         <(cut -f3 b.tsv) \
         | sort ) 
2
27.01.2020, 21:49
  • 1
    Это - хорошая идея использовать комбинацию sort, cut, paste , пока мы могли принять, это, оба набора имеют тот же размер, и все строки имеют соответствие. Здесь Вы не можете предположить, что, могли бы быть некоторые, не соответствуя строкам. –  Grzegorz Wierzowiecki 25.10.2011, 10:44
  • 2
    @Grzegorz Wierzowiecki: метод выше может иметь дело с не соответствием строкам; это не производит их. join дескрипторы это... Размер файла ре (строки); снова это не проблема. paste должен иметь равные количества строк, и это получает их, если вход правильно разграничен... Однако при пересматривании этого, я заметил проблему, вызванную путем конкатенации ключей (tr -d '\t'), например — X\tXX будет соответствовать XX\tX как XXX— К счастью, tr может справиться с пустыми символами.. Becaues пустой символ не используется в качестве разделителя, других инструментов вполне хорошо с ним (я исправил ответ) –  Peter.O 26.10.2011, 18:47
  • 3
    +1 для Вас освободил. Я только что читал man join. Очень хороший инструмент, спасибо :). –  Grzegorz Wierzowiecki 26.10.2011, 20:26
  • 4
    Для получения общей информации: Для отфильтровывания любых уродливых строк (строки), которые не имеют точного количества полей можно добавить другой фильтр к каждому имени файла. Например, ожидая 4 поля (3 разделителя), это работает: <(sed -nr '/^[^\t]*(\t[^\t]*){3}$/p' a.tsv) –  Peter.O 27.10.2011, 04:29
  • 5
    В моем домене, если какая-либо строка уродлива, я поднимаюсь ошибка, что целый вход имеет проблему. Таким образом, Ваш совет хорош, только для проверки противоположной задачи: если все строки корректны. Хороший для читателей Вы указали на это, спасибо :). –  Grzegorz Wierzowiecki 28.10.2011, 10:44

Наконец мне удалось сделать это. Таким образом, я совместно использую свое решение:

awk '
BEGIN {
    FS=OFS="\t"
    while ((getline < "a.tsv") > 0){
        a2[$1,$3] = $2; a4[$1,$3] = $4
    }
}
($1,$2) in a2 { print a2[$1,$2] FS a4[$1,$2] FS $3 }' < b.tsv

производит:

9   x   a
7   z   ccc
8   y   bb
6   w   dddd

Это решение:

  • не принимает порядка входных строк
  • работы, когда некоторые строки не имеют никакого соответствия в другом файле
  • примите строки в a.tsv уникальны согласно key = {a$1,a$3}

Для заинтересованных правильным соединением, просто необходимо удалить if( ($1,$2) in a2) оператор. Для заинтересованных левым соединением, просто "исправьте соединение" версия и подкачайте a.tsv с b.tsv (и измените код соответственно).

Примечание уникальности: Как glenn jackman замеченный, это a.tsvстроки не могли бы быть уникальными согласно key={a$1,a$3} , Вы хотели бы проверять его решение.

1
27.01.2020, 21:49

Теги

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