Соответствие столбцов в двух файлах [Особый случай, когда какой-либо элемент отсутствует?] - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть два текстовых файла разного размера. Первый из них под example1.txt содержит только один столбец чисел:

101
102
103
104
111
120
120
125
131
131
131
131
131
131

И второй текстовый файл example2.txt имеет два столбца:

101     3
102     3
103     3
104     4
104     4
111     5
120     1
120     1
125     2
126     2
127     2
128     2
129     2
130     2
130     2
130     2
131     10
131     10
131     10
131     10
131     10
131     10
132     10

Первый столбец в примере1 .txt - это подмножество первого столбца в example2.txt. Номера второго столбца в example2.txt - это связанные значения с первым столбцом.

Что я хочу сделать, это получить связанный второй столбец example1.txt, следующий за example2.txt. Я пытался, но пока не мог понять. Буду признателен за любые предложения или решения в bash, awk

Поэтому результат будет:

101     3
102     3
103     3
104     4
111     5
120     1
120     1
125     2
131     10
131     10
131     10
131     10
131     10
131     10

Использование этого awk хорошо сработало для двух вышеуказанных текстовых файлов.

awk 'NR==FNR{a[$1]++; next} ($1 in a) && b[$1]++ < a[$1]' example1.txt example2.txt

ПРОБЛЕМА, с которой я столкнулся

Теперь я работаю в большом файле, следуя тем же командам awk. И из этого результата номера строк, которые я получаю, меньше чем example1.txt. Я не смог отладить проблему. Я думаю, иногда, когда в столбце example1 отсутствует какая-либо строка, они пропускаются.

ПРЕДЛОЖЕНИЕ ОБ ОБНОВЛЕНИИ от Эда Мортона:

Я пишу здесь предложение от Эда Мортиона, чтобы проверить, какой вывод мы получаем. Следуя команде awk, awk 'NR==FNR{a[$1]++; next} ($1 in a){print $1, a[$1]}' b.txt a.txt > c.txt Подсчитывает повторяющиеся общие числа в столбце 1 (из файла b.txt), а затем частота публикуется как столбец 2 из (a.txt) в выходном файле c. текст.

   a.txt

101
102
103
104
111
120
120
125
131
131
131
131
131
131

    b.txt:
    101 3
    102 3
    103 3
    104 4
    104 4
    111 5
    120 1
    120 1
    125 2
    126 2
    127 2
    128 2
    129 2
    130 2
    130 2
    130 2
    131 10
    131 10
    131 10
    131 10
    131 10
    131 10
    132 10




    c.txt:

    101 1
    102 1
    103 1
    104 2
    111 1
    120 2
    120 2
    125 1
    131 6
    131 6
    131 6
    131 6
    131 6
    131 6

Если мы не используем a[$1]++, в приведенной выше команде awk мы получим outout c .txt:

awk 'NR==FNR{a[$1]; next} ($1 in a) && b[$1]++ < a[$1]' example1.txt example2.txt

 101
    102
    103
    104
    111
    120
    120
    125
    131
    131
    131
    131
    131
    131

1 Ответ

1 голос
/ 09 апреля 2020

Не могли бы вы попробовать следующее.

awk '
FNR==NR{
  array[$1]=$2
  next
}
($1 in array){
  print $1,array[$1]
  found[$1]
}
END{
  print "Following are values present in example2 but not in example file"
  for(j in found){
     print j
  }
}
' file2 file1

Предложение для OP для кода OP: вы увеличиваете значение массива a с индексом первого поля, которое НЕ требуется, так как значение присутствует в самом его 2-м столбце

РЕДАКТИРОВАТЬ:

awk '
FNR==NR{
  array[$1]=$2
  next
}
($1 in array){
  print $1,array[$1]
  found[$1]
}
END{
  for(j in found){
     print j
  }
}
' file2 file1 | sort -n

Каждый раз, когда он начинает заполнять второй столбец, он всегда пропускает первый раз всегда. например:

ОБНОВЛЕНИЕ для @ RavinderSingh13

Пример взят из другого упомянутого большого текстового файла.

31 65 
32
32 25 
32 25 
32 25 
32 25 
32 25 
32 25 
32 25 
32 25 
32 25 
33
33 65 
33 65 
~      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...