Этим управляют interpreter-mode-alist
. В моем Emacs (23.2.1 на Debian), существует запись для ruby1.9
из поля. Я предполагаю, что у Вас есть более старая версия; можно добавить это к Вашему .emacs
:
(add-to-list 'interpreter-mode-alist
'("ruby1.9" . ruby-mode))
Это появляется 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
Я разделил задачу к двум различным программам:
Используйте соединение (1) для присоединения к этим двум файлам
awk (1) или сокращение (1) для разделения нежелательных столбцов
join
который можно использовать для той задачи.
– ktf
24.10.2011, 15:58
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 )
sort
, cut
, paste
, пока мы могли принять, это, оба набора имеют тот же размер, и все строки имеют соответствие. Здесь Вы не можете предположить, что, могли бы быть некоторые, не соответствуя строкам.
– Grzegorz Wierzowiecki
25.10.2011, 10:44
join
дескрипторы это... Размер файла ре (строки); снова это не проблема. paste
должен иметь равные количества строк, и это получает их, если вход правильно разграничен... Однако при пересматривании этого, я заметил проблему, вызванную путем конкатенации ключей (tr -d '\t'
), например — X\tXX
будет соответствовать XX\tX
как XXX
— К счастью, tr
может справиться с пустыми символами.. Becaues пустой символ не используется в качестве разделителя, других инструментов вполне хорошо с ним (я исправил ответ)
– Peter.O
26.10.2011, 18:47
man join
. Очень хороший инструмент, спасибо :).
– Grzegorz Wierzowiecki
26.10.2011, 20:26
<(sed -nr '/^[^\t]*(\t[^\t]*){3}$/p' a.tsv)
– Peter.O
27.10.2011, 04:29
Наконец мне удалось сделать это. Таким образом, я совместно использую свое решение:
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}
, Вы хотели бы проверять его решение.