Вывести всю строку, которая имеет разницу в значении, при сравнении столбцов - PullRequest
0 голосов
/ 18 октября 2019

Я хочу напечатать всю строку, значение которой не соответствует

EG:

Symbol Qty       Symbol Qty         Symbol qty

a      10          a     10           a    11


b      11          b     11           b    11

c      12          c     12           f    13 

f      12          f      12          g    13                     

ВЫХОД:

a   10    a      10        a    11 

c   12    c      12        (empty Space)

f 12      f       12    f    13

empty space    {ES}         g   13


awk 'FNR==NR{a[$0];next}!($0 in a ) '  output1.csv output2.csv  >> finn1.csv
awk 'FNR==NR{a[$0];next}!($0 in a ) '  finn1.csv output4.csv  >> finn.csv

, но все это печатается водин столбец, который отсутствует, как 11, но мне нужна вся строка

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Однострочник awk

awk '!($1 == $3 && $2 == $4 && $3 == $5 && $4 == $6)' file

будет выводить

Symbol Qty       Symbol Qty         Symbol qty
a      10          a     10           a    11
c      12          c     12           f    12
f      12          f      12          g    13

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

$ cat file1
Symbol Qty
a      10
b      11
c      12
f      12
$ cat file2
Symbol Qty
a     10
b     11
c     12
f      12
$ cat file3
Symbol qty
a    11
b    11
f    13
g    13

Затем при условии, что у вас есть GNU awk

gawk '
  FNR > 1 { qty[$1][FILENAME] = $1 " " $2 }
  END {
    OFS = "\t"
    for (sym in qty) {
      missing = !((ARGV[1] in qty[sym]) && (ARGV[2] in qty[sym]) && (ARGV[3] in qty[sym]))
      unequal = !(qty[sym][ARGV[1]] == qty[sym][ARGV[2]] && qty[sym][ARGV[1]] == qty[sym][ARGV[3]])
      if (missing || unequal) {
        print qty[sym][ARGV[1]], qty[sym][ARGV[2]], qty[sym][ARGV[3]]
      }
    }
  }
' file{1,2,3}

output

a 10    a 10    a 11
c 12    c 12
f 12    f 12    f 13
                g 13
0 голосов
/ 18 октября 2019

Если вы хотите проверить только несоответствующие поля Qty, попробуйте следующее:

#!/bin/bash

declare    input_file="/path/to/input_file"

declare -i header_flag=0 a b c
while read line; do
  [ ${header_flag} -eq 0 ] && header_flag=1 && continue   # Ignore first line.
  [ ${#line} -eq 0 ] && continue                          # Ignore blank lines.
  read x a x b x c x <<< ${line}         # Reuse ${x} because it is not used.
  [ ${a} -ne ${b} -o ${a} -ne ${c} -o ${b} -ne ${c} ] && echo ${line}
done < ${input_file}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...