Я пытаюсь использовать таблицу поиска для поиска и замены двух определенных столбцов и получения пустого столбца в качестве вывода. Я следил за синтаксисом нескольких примеров таблиц поиска, которые я нашел в стеке, но без радости. Вот фрагменты из каждого файла.
Пример таблицы поиска - хочу найти экземпляры столбца 1 в моем файле данных и заменить их соответствующим значением в столбце 2 (первая строка - это заголовок):
#xyz type
N 400
C13 401
13A 402
13B 402
13C 402
C14 405
Подставляемый исходный файл имеет следующий формат:
1 N 0.293000 2.545000 16.605000 0 2 6 10 14
2 C13 0.197000 2.816000 15.141000 0 1
3 13A 1.173000 2.887000 14.676000 0
4 13B -0.319000 3.756000 14.937000 0
5 13C -0.351000 1.998000 14.678000 0
6 C14 0.749000 3.776000 17.277000 0 1
Соответствующие значения в столбце 2 таблицы поиска заменят значения в столбце 6 моего исходного файла (в настоящее время все нули). Вот однострочник awk, который, как я думал, должен работать:
awk -v OFS='\t' 'NR==1 { next } FNR==NR { a[$1]=$2; next } $2 in a { $6=a[$1] }1' lookup.txt source.txt
Но мой вывод по существу удаляет всю запись для столбца 6:
1 N 0.293000 2.545000 16.605000 2 6 10 14
2 C13 0.197000 2.816000 15.141000 1
3 13A 1.173000 2.887000 14.676000
4 13B -0.319000 3.756000 14.937000
5 13C -0.351000 1.998000 14.678000
6 C14 0.749000 3.776000 17.277000 1
(Шестой столбец должен быть от 400 до 405. Я рассматривал возможность использования sed, но у меня есть повторяющиеся значения в исходных и выходных столбцах моей таблицы поиска, поэтому в данном случае это не сработает. Что расстраивает, так это то, что у меня был этот - liner работал почти с тем же исходным файлом на прошлой неделе, но теперь может получить только такое поведение.Я хотел бы иметь возможность изменить мой вызов awk для одновременного поиска двух разных столбцов, но пока хотел начать с простого. Спасибо!
У вас в скрипте $6=a[$1]
вместо $6=a[$2]
.
$ awk -v OFS='\t' 'NR==FNR{map[$1]=$2; next} {$6=map[$2]} 1' file1 file2
1 N 0.293000 2.545000 16.605000 400 2 6 10 14
2 C13 0.197000 2.816000 15.141000 401 1
3 13A 1.173000 2.887000 14.676000 402
4 13B -0.319000 3.756000 14.937000 402
5 13C -0.351000 1.998000 14.678000 402
6 C14 0.749000 3.776000 17.277000 405 1
Я знал, что мне не хватает чего-то маленького - большое спасибо, Эд! Мне следовало бы почерпнуть эту деталь из нескольких ваших сообщений, которые я видел, в которых объясняется, как использовать таблицы поиска.