сравнить две строки в файле и изменить последнюю

У меня есть файл с двумя строками, например:

XXXXXXX20170412,bu.1519=1,bu.1124=2,bu.1284=3,bu.1767=13,bu.1869=15,bu.1784=16,bu.1473=32,bu.1264=43,bu.1758=96,bu.1649=122,bu.1345=140,bu.1268=215,bu.1246=516,bu.1876=601,
XXXXXXX20170413,bu.1123=1,bu.1767=27,bu.1784=32,bu.1473=57,bu.1869=41,bu.1264=91,bu.1284=54,bu.1758=191,bu.1268=387,bu.1345=319,bu.1649=322,bu.1246=1199,bu.1876=1383,

Я хочу получить все строки существуют в первой строке (начиная со строки между ", и =") и не существуют в последней строке и добавляют их в конец последней строки.

0
16.04.2017, 14:27
2 ответа

Сформируйте хэш %h, чьи ключи представляют собой строки между , и =. Формируется только для первой строки. Затем во второй строке мы ищем, присутствуют ли эти ключи во 2-й строке, и собираем те, которые не найдены, и соединяем-ed вместе с запятой.

perl -F, -lpe '
   $. == 1 and %h = /,([^=]*)=([^,]*)/g, next;
   $l = $_;
   $_ .= join ",", grep $l !~ /,\Q$_=/, keys %h;
' your_2-line_file

Результат

XXXXXXX20170412,bu.1519=1,bu.1124=2,bu.1284=3,bu.1767=13,bu.1869=15,bu.1784=16,bu.1473=32,bu.1264=43,bu.1758=96,bu.1649=122,bu.1345=140,bu.1268=215,bu.1246=516,bu.1876=601,
XXXXXXX20170413,bu.1123=1,bu.1767=27,bu.1784=32,bu.1473=57,bu.1869=41,bu.1264=91,bu.1284=54,bu.1758=191,bu.1268=387,bu.1345=319,bu.1649=322,bu.1246=1199,bu.1876=1383,bu.1519,bu.1124
0
28.01.2020, 04:47

Я бы разделил файл на два, каждая из которых содержала одну из строк. Затем я разделял строки запятой. Затем запустите diff и скопируйте результаты, снова объедините их в одну строку, et violà .

Это долгий путь. Я уверен, что вы могли бы написать какой-нибудь скрипт awk или что-нибудь, чтобы сделать это одним махом.

0
28.01.2020, 04:47

Теги

Похожие вопросы