2016-08-05 2 views
-2

Я новичок с ш и AWK Comand, я пытался несколько команд с разными вариантами, но не работает :(AWK соответствующие поля между двумя файлами

Я два файла, и я хочу, чтобы соответствовать позиция 22,3 из file1 с струны на file2 Если совпадения нет, мне нужно написать file1 линию

file1:..

/партии/общий/TZ/TMP/AAA
/batch/shared/TZ/TMP/BBB
/batch/shared/TZ/T MP/CCC
/партии/общий/TZ/TMP/DDD

File2:

BBB
DDD

Результат:

/партии/общий/TZ/TMP/BBB
/пакет/доля d/TZ/TMP/DDD

Я никогда не писал на этой странице, но сохранял свою задницу много раз. БОЛЬШОЕ СПАСИБО!

+2

Почему 'позиция 22,3'? похоже, что вы хотите сопоставьте пятое поле с файлом 1, рассмотрите/как разделитель, с единственным полем в файле2 – sjsam

+3

'пытались некоторые команды', помещаем их в ваш пост. – 123

+1

_If там_ ** нет ** _match, мне нужно_ ** написать строку file1 ** Не является ли ожидаемый результат противоположным (или это просто мой грипп)? –

ответ

1

Это именно вы ищете:

awk 'NR==FNR{a[$0]=1;next} {n=0;for(i in a){if(substr($0,22,3)~i) { n=1} } } n' file2 file1 

Надеется, что это помогает :)

+0

TY! Это работает отлично. Возможно ли напечатать обратное, как я добавил свой последний комментарий? –

+0

Хм, если вы переключите места 'n = 1' и' n = 0', это, вероятно, будет работать. Или, в конце концов, замените 'n' на'! N'. –

1

Похоже, вы ищете функции substr в AWK

$ awk 'NR==FNR{arry[substr($0,22,3)]=$0;next}$0 in arry{print arry[$0]}' file1 file2 
/batch/shared/TZ/TMP/BBB 
/batch/shared/TZ/TMP/DDD 

должны делать то, что вы хотите сделать.

Однако есть более простой вариант, использовать / в качестве разделителя

awk -v FS="/" 'NR==FNR{arry[$NF]=$0;next}$0 in arry{print arry[$0]}' file1 file2 

$NF Вот бы дать последнее поле в каждой записи для первого файла.

+1

Я бы предположил, что использование '/' в качестве поля sep и получение последнего поля было бы более общим и надежным. – 123

+1

@ 123: То же чувство здесь. Обновлено;) – sjsam

+1

Кроме того, использование файла в обратном порядке уменьшит сложность i.e 'awk -F/'NR == FNR {a [$ 0]; next} $ NF в файле file2 – 123

0

здесь:

$ awk '!(substr($0,22,3) in a){a[$0];next} 1' file2 file1 
/batch/shared/TZ/TMP/BBB 
/batch/shared/TZ/TMP/DDD 

Walk-через:

!(substr($0,22,3) in a) # first read file2 with partial strings of file1 (BBB) 
{      # there won't be match until substr returns something so 
    a[$0]    # put it in a and 
    next     # process next 
} 
1      # when substr returns a positive match, print it 

Если вы на самом деле нужны противоположные res как указано в комментариях к вопросу:

$ awk 'NR>FNR && !(substr($0,22,3) in a) {print; next} {a[$0]}' file2 file1 
/batch/shared/TZ/TMP/AAA 
/batch/shared/TZ/TMP/CCC 
0

Спасибо вам всем!

awk 'NR==FNR{a[$0]=1;next} {n=0;for(i in a){if(substr($0,22,3)~i) { 
n=1} } } n' file2 file1 

awk -F/ 'NR==FNR{a[$0];next}$NF in a' file2 file1 

Эти два результата работают на вопрос, который я поставил на своем первом комментарии. Я сделал ошибку, мне нужен противоположный результат, чем результат я поставил :(

Новый результат:

/партии/общий/TZ/TMP/ВВВ
/партии/общий/TZ/TMP/DDD

Извините за мой английский.

Большое спасибо!

Смежные вопросы