У меня есть три файла, содержащие отсортированную последовательность чисел, по одному на строку:
file1
1
2
3
file2
1
3
4
file3
1
5
Я хочу "выровнять" эти три файла рядом, как показано ниже:
file1 file2 file3
1 1 1
2
3 3
4
5
Я пытался с, sdiff
но он работает только с 2 файлами
text-processing
awk
diff
Cheseaux
источник
источник
diff3
?diff3
нет этого выходного формата.diff3
и, как правильно сказал @Kusalananda, он не производит такой вывод. Кроме того, я ищу общее решение (для n файлов, n> 2)5
в пятой строке результат, а не третий?Ответы:
Вы можете обработать каждый файл и напечатать строку с каким-нибудь символом, например,
X
для каждого пропущенного числа в последовательности 1- max (где max - последнее число в этом файле),paste
результаты затем заменят этот символ пробелом:Если определенное значение отсутствует во всех файлах, вы получите пустые строки в выводе (на самом деле они не пустые, они содержат только пробелы).
Чтобы удалить их, замените
tr X ' '
наsed '/[[:digit:]]/!d;s/X/ /g'
Также, если вам нужен заголовок, вы всегда можете сначала запустить что-то вроде этого:источник
;1
Хотя мне было трудно понять, что означало то, что было в конце. Я использую{print $0}
вместо этого, немного менее загадочным ИМХО. В любом случае, еще раз спасибоОбщее решение с помощью awk: требуется GNU awk
Взял другой и более простой подход к этому на основе комментария Дона:
источник
Раствор с
bash
,join
,paste
и плохим вкусом:За исключением последнего
sort -n
, все это работает с любыми текстовыми элементами, а не числами, если элементы не содержат вкладок (ноTAB
могут быть изменены на любой другой разделитель). Кроме того, это может быть сделано только с 3 временными файлами и некоторыми перестановками (но это только увеличит дурной вкус).источник