2013-07-10 3 views
0

У меня возникла проблема с использованием awk. На самом деле у меня есть два типа файлов. Ниже содержится файл.Двойные кавычки поступают в файл

Файл1

x|y|z|a|b|c 
x|y|z|a|b|c 
x|y|z|a|b|c 

Файл2

"x"|"y"|"z"|"a"|"b"|"c" 
"x"|"y"|"z"|"a"|"b"|"c" 
"x"|"y"|"z"|"a"|"b"|"c" 

Я должен искать некоторое значение из второго столбца, используя AWK. но проблема в том, что файл1 имеет записи без кавычек, тогда как файл2 имеет записи с двойными кавычками. Мне нужно создать единую логику для поиска значения из второго столбца.

Может ли кто-нибудь помочь?

+0

Как насчет удаления' '' в файле2? 'tr -d '' ' fedorqui

+0

Мы не можем удалить кавычки, поскольку в скрипте есть какая-то другая логика – vishal

+0

Что значит «поиск»? искать 'y' в обоих файлах? или что? – Imagination

ответ

0

Просто фильтровать цитаты с sed 's/\"//g' и трубы их AWK с |

$ sed 's/\"//g' file2 
x|y|z|a|b|c 
x|y|z|a|b|c 
x|y|z|a|b|c 

Ваш конечный результат будет что-то вроде

$ sed 's/\"//g' file2 | awk <magic goes here...> 
+0

Это изменит формат файла для '' | '' -сепарализованных файлов на '|' -сепаратированный, что, вероятно, нежелательно. Если бы все было в порядке, есть тривиальное решение полностью внутри awk, просто установив OFS = "|" а затем присваивая $ 1 = $ 1, поэтому sed не будет полезен в любом случае. –

1

Я заметил, что нет никакой необходимости очистить файл. Для поиска значения y в обоих файлах вы можете сделать следующее:

$ awk -F"|" '$2~/y/' file1 file2 
x|y|z|a|b|c 
x|y|z|a|b|c 
x|y|z|a|b|c 
"x"|"y"|"z"|"a"|"b"|"c" 
"x"|"y"|"z"|"a"|"b"|"c" 
"x"|"y"|"z"|"a"|"b"|"c" 

С более сложного ввода:

$ cat file1 
x|y|z|a|b|c 
x|T|z|a|b|c 
x|aa|y|a|b|c 
$ cat file2 
"x"|"y"|"z"|"a"|"b"|"c" 
"x"|"22"|"z"|"a"|"b"|"c" 
"x"|"t"|"y"|"a"|"b"|"c" 

Получаем:

$ awk -F"|" '$2~/y/' file1 file2 
x|y|z|a|b|c 
"x"|"y"|"z"|"a"|"b"|"c" 
1

Я желаю вам отправил некоторые (не только формат с заполнителями x/y, но фактические данные) и ожидаемый результат, чтобы мы могли тестировать наши решения, но это СЛЕДУЕТ делать то, что вы хотите:

awk -F'"?[|]"?' '$2 == whatever' file 

Замените «безотносительно» на то, что вы ищете, и замените == на ~, если вы хотите сравнить RE, а не точное сравнение.

Если вам нужно было посмотреть в первом и последнем полях, тогда есть различные решения, и «лучший» будет определяться вашими реальными данными, но вот один из подходов, если у вас нет нежелательных метасимволов RE в " что угодно ":

awk -F'"?[|]"?' ' $1 ~ "^\"?" whatever "$"' file 
awk -F'"?[|]"?' '$NF ~ "^" whatever "\"?$"' file 
Смежные вопросы