2010-12-07 3 views
3

У меня есть 2 файла file_A и file_B. Файл file_A содержит имя файла и после пробела строку кода. Эта строка кода может иметь случайный тип символов, говорящих пробелы, и т. Д. Это выглядит так. Обратите внимание, что строка кода в файле не окружена(). Это было только для иллюстрации.В linux как присоединиться к 2 файлам

Баша $ кошка file_A

file_name1 (code line a) 
file_name1 (code line b) 
file_name2 (code line c) 
file_name2 (code line d) 
file_name2 (code line e) 

Файл file_B содержит имя_файл вместе с частотой в file_A

Баша $ кошачьей file_B

file_name1 2 
file_name2 3 

Я хочу выхода как: (частота, имя_файла, code_line)

2 file_name1 (code line a) 
2 file_name1 (code line b) 
3 file_name2 (code line c) 
3 file_name2 (code line d) 
3 file_name2 (code line e) 

Баш $ присоединиться -1 1 -2 1 file_B file_A> file_C

я file_C, как (я присоединиться поля как 1-го поля)

file_name1 2 (code line a) 
file_name1 2 (code line b) 
file_name2 3 (code line c) 
file_name2 3 (code line d) 
file_name2 3 (code line e) 

Как получить поле частоты в первом поле ?.

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

Спасибо,

+0

Измените свой вопрос и используйте кнопку 101010 в редакторе, чтобы сохранить форматирование фрагментов файла – thkala 2010-12-07 17:15:30

ответ

3
join file_B file_A | awk '{t=$1; $1=$2; $2=t; print}' > file_C 
0
sed 's#([^ ]*) ([^ ]*) (.*)#$2 $1 $3#g' 

Примечания: Может быть, вы не должны бежать нормальные кронштейны с backspaces, чтобы заставить его работать.

1

Примечание объединения не поддерживает указание диапазона полей в формате вывода, так что следующий немного Hacky, но поддерживает до 8-ми пробелов в «строке кода»

join -o 1.2,0,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9 file_B file_A 
Смежные вопросы