2015-02-24 3 views
0

Мои два входных файла разделены по каналам.Проблема разбора массива AWK

Файл 1:

a|b|c|d|1|44 

Файл 2:

44|ab|cd|1 

Я хочу, чтобы хранить все свои значения первого файла в массиве.

awk -F\| 'FNR==NR {a[$6]=$0;next}' 
  1. Так что, если я храню выше способ можно интерпретировать массив; скажем, хочу знать $3 из File 1. Как я могу получить tat от a[].

  2. Также я смогу получить доступ к значениям массива, если я выйду из этого awk?

Благодаря

+0

wrt 2 - когда вы выходите из программы на языке C (или независимо от вашего выбора), вы ожидаете получить доступ к содержимому массивов и других переменных, которые вы использовали внутри этой программы? Awk ничем не отличается. –

ответ

1

я отвечу на вопрос, как говорится, но я должен задаться вопросом, является ли она завершена. Вы заявляете, что у вас есть второй входной файл, но он не играет роли в вашем фактическом вопросе.

1) Это, вероятно, будет наиболее целесообразно хранить поля индивидуально, как и в

awk -F \| '{ for(i = 1; i < NF; ++i) a[$NF,i] = $i } END { print a[44,3] }' filename 

См here Подробные сведения о многомерных массивов в AWK. Вы можете также использовать функцию split:

awk -F \| '{ a[$NF] = $0 } END { split(a[44], fields); print fields[3] }' 

, но я не вижу в этом смысла здесь.

2) Нет. В большинстве случаев вы можете распечатать данные таким образом, чтобы окружающая оболочка понимала и использовала подстановку команд для сборки из нее массива оболочек, но оболочка POSIX вообще не знает массивы, а bash знает только одномерные массивы. Если вам нужна такая функциональность, вероятно, вы должны использовать более мощный язык сценариев, такой как Perl или Python.

Если я все-таки угадываю здесь, вы хотите использовать массив, построенный из первого файла, при обработке второго, вам не нужно оставлять awk для этого. Распространенная картина

awk -F \| 'FNR == NR { for(i = 1; i < NF; ++i) { a[$NF,i] = $i }; next } { code for the second file here }' file1 file2 

Здесь FNR == NR является условие, что это только справедливо, когда первый файл обрабатывается (номер записи в текущем файле такое же, как количество записи в целом, это только true в первом файле).

+0

Thanks Wintermute – Madan

+0

Hi Wintermute My i/p file похож на 20150118140133 | 6282147664321 | 76761 | 20110421 | 19700101 20150118140133 | 6282157668986 | 62281 | 20141225 | 20150118140133 | 6282157669102 | 3278294 | 20140618 | 20140906 Я использовал все три под awks. Я получаю пробелы: [ottstusr @ osdinfbsdtapp1 mvann] $ awk -F \ | '{for (i = 1; i <= NF; ++ i) a [$ NF, $ i] = $ i} END {print a [1,3]}' SPP_IN [ottstusr @ osdinfbsdtapp1 mvann] $ awk -F \ | '{для (i = 1; i <= NF; ++ i) a [NF, i] = $ i} END {print a [1,3]}' SPP_IN [ottstusr @ osdinfbsdtapp1 mvann] $ awk -F \ | '{for (i = 1; i <= NF; ++ i) a [NF, i] = $ i} END {print a [1,3]}' SPP_IN – Madan

0

Чтобы сохранить его простым, вы можете достичь своей цели хранения (и доступа) значений в массиве без использования AWK:

arr=($(cat yourFilename |tr "|" " ")) #store in array named arr 

# accessing individual elements 
echo ${arr[0]} 
echo ${arr[4]} 

# ...or accesing all elements 
for n in ${arr[*]} 
do 
    echo "$n" 
done 

... даже если мне интересно, если это то, что вы ищете. Инитальный вопрос не совсем ясен.

+0

, если мой ip-файл равен a | b | C | d ш | г | г | ч я хочу, чтобы сохранить значение в массиве как а [1,1] = а а [1,2] = Ь а [2,1] = w Просьба предложить любой способ добиться этого. @Wintermute У меня есть два файла i/p и вам нужно выполнить проверку уровня поля. – Madan

+0

Bash не поддерживает многомерные массивы. Если вы заинтересованы в управлении этими двумя файлами в bash-скрипте, вы можете попробовать быстрое, но не очень элегантное решение, например: arr1 = ($ (cat yourFirsten Имя файла | tr "|" "")) arr2 = ($ (cat yourSecondFilename | tr "|" "")) ... но, пожалуйста, уточните, какова ваша цель: Просто управлять информацией каким-либо образом? (Я бы предложил вам использовать bash для простых операций, perl или python для более требовательных). Или вы хотите/нужно сделать это с помощью awk? – MarcM

+0

Спасибо за ответ. Моя цель - сделать сопоставление файлов. SAY первое поле первой записи равно null, второй входной файл должен быть UNKNOWN в первом поле второй записи. – Madan

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