2016-08-31 2 views
0

У меня есть файл тестовых данных, как следующийПочему результат от AWK, похоже, не работает

 
PAT1 
3 - first block 
4 
PAT2 
PAT3 
7 - second block 
PAT4 
PAT5 
10 - third block 
PAT6 
PAT7 
12 - forth block 

Если я запускаю следующую команду из оболочки, чтобы найти линии между pat1 и PAT5, включая строки, содержащие две строки , он отлично работает с shell prompty.

 
awk '/PAT1/, /PAT5/ ' test_file 

Результаты следующие:

 
PAT1 
3 - first block 
4 
PAT2 
PAT3 
7 - second block 
PAT4 
PAT5 

Но если я хочу, чтобы выполнить эту командную строку AWK в файл сценария оболочки, он больше не работает и ничего не в results.txt файле.

#!/bin/sh 

Data="PAT1"    
Data2="PAT2"          

echo "$Data, $Data2" 
awk '/$Data/, /$Data2/' test_file > results.txt 

Я считаю, что синтаксис awk-кода неверен в сценарии оболочки. Я попытался прочитать страницу link, но я не мог быстро понять, что не так с awk-кодом в моем сценарии оболочки.

ответ

4

awk видит буквальный текст $Data и $Data2, а не интерполированные значения. В этом случае, вы можете (вероятно) просто использовать двойные кавычки:

awk "/$Data/,/$Data2/" test_file > results.txt 

Это не сработает, если либо данные или Data2 содержат /, так что вы хотите вместо этого:

awk 'match($0, data), match($0, data2)' data="$Data" data2="$Data2" test_file > results.txt 
+0

Вы правы. Двойная цитата «исправлена ​​моя проблема. Большое спасибо! –

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