Сравните две строки - PullRequest
       4

Сравните две строки

1 голос
/ 29 марта 2019

Сравнить первый столбец файла B (имя) с первым столбцом файла A

  • При совпадении выбрать значение второго столбца (Доусон)
  • Если не вставить пробел

Сравнить третий столбец файла B (возраст) со вторым столбцом файла A.

  • При совпадении выбрать значение четвертого столбца (21)
  • Если не вставить пробел

Сравнить пятый столбец файла B (Dept) с третьим столбцом файла A

  • При совпадении выбрать значение шестого столбца
  • Если не вставить пробел

Сравнить седьмой столбец файла B (пол) с четвертым столбцом файла A.

  • При совпадении выбрать значение четвертого столбца (мужской)
  • Если не вставить пробел

Файл A Data

Name|Age|Department|Sex|

Файл B Данные

Name|Dawson|Age|21|Sex|Male
Name|Deepak|Age|22|Department|EEE|Sex|Male

Ожидаемый вывод - Файл C

Name|Age|Department|Sex
Dawson|21||Male
Deepak|22|EEE|Male

Я пробовал ниже, но он просто выводит даже столбцы.

awk 'BEGIN{FS=OFS="|"} {for(i=2;i<=NF;i+=2){val=(val?val OFS:"") $i};print val;val=""}' File_B.txt

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

это можно сделать маленьким скриптом:

#!/bin/bash

cat fileA | sed 's#^|##' | sed 's#|$##' > fileC
for line in $(cat fileB)
do
  unset output
  for col in $(cat fileA | sed "s#|# #g")
  do
    value=$(echo $line | sed "s#.*$col|\([^|]*\)|*.*#\1#")
    [ "$value" != "$line" ] && output=$output"|"$value || output=$output"|"
  done
    echo $output | sed 's#^|##' | sed 's#|$##' >> fileC
done
0 голосов
/ 29 марта 2019

Глядя на входные и выходные данные, я вижу

  • файл A представляет собой список ключей
  • файл B содержит список комбинаций ключ + значение
  • в выходных данных должны быть столбцы для каждого ключа
    • если в строке файла B нет ключа, столбец должен быть пустым

Это может бытьлегко решается с помощью хеша, карты, dict, ... (выберите структуру данных для вашего любимого языка).Вот решение с использованием хэша в Perl:

  • чтение каждой строки из файла B
  • с разбивкой по |: возвращает список четного размера
  • список назначенийдля хэша: четная запись будет ключом, нечетная запись будет значением
  • , распечатывает содержимое хэша
    • , используя список ключей из файла A
    • , еслиключ не существует, вставьте пустую строку
    • , объедините столбцы с |, чтобы сгенерировать строку строки
#!/usr/bin/perl
use warnings;
use strict;
use autodie;

die "usage: $0 <headers> <data>\n"
    if @ARGV < 2;

open(my $ifh, '<', $ARGV[0]);
chomp(my $headers = <$ifh>);
close($ifh);

my @headers = split(/\|/, $headers);

open($ifh, '<', $ARGV[1]);
print "$headers\n";
while (<$ifh>) {
    chomp;
    my %row = split(/\|/);
    print join('|',
               map { $row{$_} // '' } @headers
          ), "\n";
}
close($ifh);

exit 0;

Тестовый прогон:

$ cat fileA.txt 
Name|Age|Department|Sex|

$ cat fileB.txt 
Name|Dawson|Age|21|Sex|Male
Name|Deepak|Age|22|Department|EEE|Sex|Male

$ perl dummy.pl fileA.txt fileB.txt
Name|Age|Department|Sex|
Dawson|21||Male
Deepak|22|EEE|Male
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...