В линуксе как объединить 2 файла - PullRequest
3 голосов
/ 07 декабря 2010

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

bash $ cat 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

bash $ cat file_B

file_name1 2
file_name2 3

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

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)

bash $ join -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)

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

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

Спасибо,

Ответы [ 3 ]

3 голосов
/ 08 декабря 2010
join file_B file_A | awk '{t=$1; $1=$2; $2=t; print}' > file_C
1 голос
/ 08 декабря 2010

Примечание: объединение не поддерживает указание диапазона полей в выходном формате, поэтому приведенное ниже несколько странно, но поддерживает до 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
0 голосов
/ 07 декабря 2010
sed 's#([^ ]*) ([^ ]*) (.*)#$2 $1 $3#g'

Примечание. Возможно, вам придется выйти из обычных скобок с пробелами, чтобы это работало.

...