Как сравнить 3 строки столбец за столбцом из одного и того же файла и вернуть FALSE, если какой-либо не соответствует - PullRequest
0 голосов
/ 16 мая 2018

Например, ниже приведено содержимое файла CSV,

NAME     |COMPARNY  |           DT1|           DT2|
MR.X     |ABC       |   48737953.20|   11219420.39|
MR.N     |XYZ       |   48737953.20|   11219421.39|
MR.B     |LMN       |   48737953.20|   11219420.39|

Мне нужен вывод, как показано ниже, так как было значение одного столбца не совпадает

NAME     |COMPARNY  |           DT1|           DT2|
MR.X     |ABC       |   48737953.20|   11219420.39|
MR.N     |XYZ       |   48737953.20|   11219421.39|
MR.B     |LMN       |   48737953.20|   11219420.39|

         |          |          TRUE|         FALSE|

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Ниже должно работать для вашего формата:

awk 'BEGIN { FS=OFS="|"; uniq[3]="TRUE"; uniq[4]="TRUE";} # Initialize variables
{print $0}                                          # Print the input file as it is
NR == 2 { val[3] = $3; val[4] = $4 }                # Initialize values based on the second line
NR > 2 { if (uniq[3]=="TRUE") { if ($3 != val[3]) { uniq[3] = "FALSE" } } # Validate 3rd column
    if (uniq[4]=="TRUE") { if ($4 != val[4]) { uniq[4] = "FALSE" } }      # Validate 4th column
} END {printf("\n%9s|%10s|%14s|%14s|\n", "", "", uniq[3], uniq[4])}' input.csv    # Print the last line
0 голосов
/ 06 июня 2018

Ниже будет работать ..

#!/bin/ksh

#replacing pipe with comma
sed "s/|/,/g" input.txt > temp1.txt

#traverse rows into columns
awk -F, '{for(i=1;i<=NF;i++){A[NR,i]=$i};if(NF>n){n=NF}}
END{for(i=1;i<=n;i++){
for(j=1;j<=NR;j++){
s=s?s","A[j,i]:A[j,i]}
print s;s=""}}' temp1.txt > temp2.txt

#trim all white spaces
sed 's/ //g' temp2.txt > temp3.txt

#comparing all values between CALC & PMI and generate new column for SMDW
awk -F, '{print $0, (($3==$4)?"":"UN") "MATCH"}' temp3.txt > temp4.txt
sed "s/ /,/g" temp4.txt > temp5.txt

#traverse rows into columns again
awk -F, '{for(i=1;i<=NF;i++){A[NR,i]=$i};if(NF>n){n=NF}}
END{for(i=1;i<=n;i++){
for(j=1;j<=NR;j++){
s=s?s","A[j,i]:A[j,i]}
print s;s=""}}' temp5.txt > temp6.txt

#csv to fixed length convertion for better viewing
awk -F, '{printf("%22s|%18s|%18s|%18s\n", $1, $2, $3, $4, $5, $6, $7, $8, 
$9)}' temp6.txt > output.txt

exit;
EOF

Предположим, мы анализируем данные ниже в файле input.txt,

NAME     |COMPARNY  |           DT1|           DT2
MR.X     |ABC       |   48737953.20|   11219420.39
MR.N     |XYZ       |   48737953.20|   11219421.39
MR.B     |LMN       |   48737953.20|   11219420.39

А данные в output.txt есть,

              NAME|          COMPARNY|               DT1|               DT2
              MR.X|               ABC|       48737953.20|       11219420.39
              MR.N|               XYZ|       48737953.20|       11219421.39
              MR.B|               LMN|       48737953.20|       11219420.39
           UNMATCH|           UNMATCH|             MATCH|           UNMATCH
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...