2015-06-24 7 views
1

Я пытаюсь вернуть данные, которые встречаются на определенных строках в одном файле, и использовать эти строки для возврата данных из другого файла на тех же строках. Я просматриваю заметки в Интернете здесь, и нашел то, что, как я думал, будет работать. Однако в настоящее время я получаю сообщение об ошибке. какие-либо предложения?с использованием файла данных, извлеченного с помощью awk для команды sed в другом файле

file1 имеет значения 1 2 3

file2 имеет значения three four five

поэтому выход должен быть three

#!/bin/bash 
awk '/one/ {print NR}' file1>fileonehold 
filename="fileonehold" 
while read -r line 
do 
    sed -n ${line}p file2 >> file2hold 
done < "$fileonehold" 

ответ

1

Если я понимаю, что вы пытаетесь сделать правильно, то наиболее простой способ использовать awk:

awk -v pattern="one" 'NR == FNR && $0 ~ pattern { a[FNR] = 1 } NR != FNR && a[FNR]' file1 file2 

Это работает следующим образом: -v pattern="one" делает известным awk переменную с именем pattern, значение которой составляет one. Тогда код

NR == FNR && $0 ~ pattern { # if we're still processing the first file (file1), 
          # and if the current line matches the pattern 
    a[FNR] = 1     # remember that line number. 
} 
NR != FNR && a[FNR]   # if we're not processing the first file and the 
          # current line number is a remembered one, print. 

Ядро Хитрость здесь есть условие NR == FNRNR != FNR). NR - количество записей (строк, по умолчанию), обработанных до сих пор, FNR - это количество записей, обработанных до сих пор от текущего файла. Они равны при обработке первого файла из командной строки, но не после этого.

Кроме того: условие NR != FNR && a[FNR] не имеет ассоциированного действия, поэтому действие по умолчанию (печать) выполняется, если оно истинно. a[FNR] имеет значение только для отмеченных строк, поскольку значение по умолчанию (пустая строка) считается ложным, а значение 1 (значение маркера) считается значением awk.

если первый файл пуст, и в этом случае код все равно ничего не напечатает.

+0

Извините, только что обновил вопрос, я хочу только вернуть значения по строкам во втором файле на основе определенного значения, найденного в первом файле, то есть, если я ищу значение 2 в файле один, он возвращает строку 2, а затем Я использую эту строку, чтобы получить четыре из файла2. – ryddner

+0

См. Редактирование. Обратите внимание, что файлы обрабатываются другим способом для этого. – Wintermute

+0

Я думаю, что сделал трюк, спасибо тонну! – ryddner