задан список файлов в командной строке, надо вывести последовательно
1-ю строку из 1-го файла
1-ю строку из 2-го файла
1-ю строку из 3-го файла
...
1-ю строку из N-го файла
2-ю строку из 1-го файла
2-ю строку из 2-го файла
2-ю строку из 3-го файла
...
2-ю строку из N-го файла
ну и так далее, причем количество строк в файлах разное
Haskell:
import System import Data.List main = getArgs >>= mapM readFile >>= mapM_ putStrLn . concat . transpose . map (lines)
Perl:
my @fs = map { open(my $fh, $_); $fh } @ARGV; while( my @fh = grep { not eof($_) } @fs ) { print my $f = readline($_) foreach (@fh) };
Ruby:
fs = ARGV.map { |fn| File.open(fn) } while fs.map(&:eof?).include? false fs.each { |f| puts f.gets unless f.eof? } end
LISP
(let ((files (mapcar #'open *args*))) (loop (unless (mapcan (lambda (f &aux (x (read-line f nil))) (when x (format t "~A~%" x) (list x))) files) (return))))
C++
#include#include #include #include #include using namespace std; int __cdecl main(int argc, char *argv[]) { vector files(argc-1); for (int i=1; i<argc; ++i) files[i-1].open(argv[i]); for (bool hasLine=true; hasLine;) { hasLine = false; for (size_t i=0; i<files.size(); ++i) { string line; if (getline(files[i], line)) { hasLine = true; cout << line << endl; } } } return 0; }
Erlang
компиляция erlc a.erl запуск: erl -noshell -s a start -- file file1 file2 file3 -module(a). -export([start/0]). start() -> output([ FD || {ok, FD} <- [ file:open(X, read) || X <- init:get_plain_arguments() ]]), erlang:halt(). output([]) -> ok; output(List) -> output(lists:filter( fun(FD) -> case io:get_line(FD, "") of Line when is_list(Line) -> io:format(Line), true; _ -> false end end, List ) ).
C#
static void Main(string[] args) { for (var files = args.Select(a => new StreamReader(a)).ToList(); 0 < files.Select(f => f.ReadLine()).Where(line => line != null).Count(line => { Console.WriteLine(line); return true; }); ); }
Java
package example.io; import static net.sourceforge.jfunctions.functions.FunctionToolkit.*; import static net.sourceforge.jfunctions.io.IOToolkit.file; import static net.sourceforge.jfunctions.structures.StructureToolkit.list; import net.sourceforge.jfunctions.io.FileLineParser; public class SortLinesExample { public static void main(String[] args) { for (String line : merge(transform(transform(list(args), file()), FileLineParser.ignoringErrors()))) { System.out.println(line); } } }
Python
import sys from itertools import izip_longest as izip, chain, ifilter def main(args): for str in ifilter(lambda x: x is not None, chain.from_iterable( izip( *[open(a) for a in args)] ) ): print str.rstrip() if __name__=='__main__': main(sys.argv[1:])
OCaml
open ExtLib open List let (>>) f g x = g (f x) let (|>) x f = f x;; let fs = Array.to_list Sys.argv |> tl |> map (open_in >> Std.input_lines) in while fold_left (fun go e -> Option.may print_endline (Enum.get e); go || not (Enum.is_empty e)) false fs do () done