From 8c4b0ba4b9205e36c42d056eb1d1a02bb07a60bd Mon Sep 17 00:00:00 2001 From: Ole Tange Date: Sat, 7 Jan 2012 04:17:13 +0100 Subject: [PATCH] parallel: --header will now parse the first line and you can use column names as {colname}. --- src/parallel | 37 +++++++++++++++++++++++--------- src/parallel.pod | 5 +++-- testsuite/tests-to-run/test65.sh | 2 ++ testsuite/wanted-results/test65 | 2 ++ 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/parallel b/src/parallel index a8268c6f..93aceb30 100755 --- a/src/parallel +++ b/src/parallel @@ -1,6 +1,6 @@ #!/usr/bin/perl -w -# Copyright (C) 2007,2008,2009,2010,2011 Ole Tange and Free Software +# Copyright (C) 2007,2008,2009,2010,2011,2012 Ole Tange and Free Software # Foundation, Inc. # # This program is free software; you can redistribute it and/or modify @@ -53,6 +53,15 @@ if($Global::max_number_of_args) { $number_of_args = 1; } +my $command = ""; +if(@ARGV) { + if($Global::quoting) { + $command = shell_quote(@ARGV); + } else { + $command = join(" ", @ARGV); + } +} + my @fhlist; @fhlist = map { open_or_exit($_) } @::opt_a; if(not @fhlist) { @@ -63,13 +72,19 @@ if($::opt_skip_first_line) { my $fh = $fhlist[0]; <$fh>; } - -my $command = ""; -if(@ARGV) { - if($Global::quoting) { - $command = shell_quote(@ARGV); - } else { - $command = join(" ", @ARGV); +if($::opt_header) { + my $fh = $fhlist[0]; + my $line = <$fh>; + chomp($line); + # split with colsep or \t + # TODO should $header force $colsep = \t if undef? + my $delimiter = $::opt_colsep; + my $id = 1; + ::debug("Delimiter: '$delimiter'"); + for my $s (split /$delimiter/o, $line) { + ::debug("Colname: '$s'"); + $command =~ s/\{$s\}/\{$id\}/g; + $id++; } } @@ -483,6 +498,7 @@ sub options_hash { "shebang|hashbang" => \$::opt_shebang, "Y" => \$::opt_retired, "skip-first-line" => \$::opt_skip_first_line, + "header" => \$::opt_header, ); } @@ -512,7 +528,7 @@ sub get_options_from_array { sub parse_options { # Returns: N/A # Defaults: - $Global::version = 20111222; + $Global::version = 20120107; $Global::progname = 'parallel'; $Global::infinity = 2**31; $Global::debug = 0; @@ -583,6 +599,7 @@ sub parse_options { if(defined $::opt_tmpdir) { $ENV{'TMPDIR'} = $::opt_tmpdir; } if(defined $::opt_help) { die_usage(); } if(defined $::opt_colsep) { $Global::trim = 'lr'; } + if(defined $::opt_header) { $::opt_colsep = defined $::opt_colsep ? $::opt_colsep : "\t"; } if(defined $::opt_trim) { $Global::trim = $::opt_trim; } if(defined $::opt_arg_sep) { $Global::arg_sep = $::opt_arg_sep; } if(defined $::opt_arg_file_sep) { $Global::arg_file_sep = $::opt_arg_file_sep; } @@ -1788,7 +1805,7 @@ sub version { } print join("\n", "GNU $Global::progname $Global::version", - "Copyright (C) 2007,2008,2009,2010,2011 Ole Tange and Free Software Foundation, Inc.", + "Copyright (C) 2007,2008,2009,2010,2011,2012 Ole Tange and Free Software Foundation, Inc.", "License GPLv3+: GNU GPL version 3 or later ", "This is free software: you are free to change and redistribute it.", "GNU $Global::progname comes with no warranty.", diff --git a/src/parallel.pod b/src/parallel.pod index 641148cd..a8424d2b 100644 --- a/src/parallel.pod +++ b/src/parallel.pod @@ -3145,7 +3145,7 @@ Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk Copyright (C) 2008,2009,2010 Ole Tange, http://ole.tange.dk -Copyright (C) 2010,2011 Ole Tange, http://ole.tange.dk and Free +Copyright (C) 2010,2011,2012 Ole Tange, http://ole.tange.dk and Free Software Foundation, Inc. Parts of the manual concerning B compatibility is inspired by @@ -3154,7 +3154,8 @@ the manual of B from GNU findutils 4.4.2. =head1 LICENSE -Copyright (C) 2007,2008,2009,2010,2011 Free Software Foundation, Inc. +Copyright (C) 2007,2008,2009,2010,2011,2012 Free Software Foundation, +Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/testsuite/tests-to-run/test65.sh b/testsuite/tests-to-run/test65.sh index 22561ee6..d85f9cc1 100644 --- a/testsuite/tests-to-run/test65.sh +++ b/testsuite/tests-to-run/test65.sh @@ -24,6 +24,8 @@ echo '### Test --resume --joblog followed by --resume --joblog'; parallel -j2 --resume --joblog /tmp/joblog2 sleep {} ::: 1.1 2.2 3.3 4.4; cat /tmp/joblog2 | wc; rm -f /tmp/joblog2; +echo '### Test --header'; + printf "a\tb\n1\t2" | parallel --header echo {b} {a} EOF echo '### Test --shellquote' diff --git a/testsuite/wanted-results/test65 b/testsuite/wanted-results/test65 index 4d7d470a..0be2dd42 100644 --- a/testsuite/wanted-results/test65 +++ b/testsuite/wanted-results/test65 @@ -30,6 +30,8 @@ parallel: -H has been retired. Use --halt. 5 49 205 ### Test --resume --joblog followed by --resume --joblog 5 49 205 +### Test --header +2 1 ### Test --shellquote awk\ -v\ FS=\"\\\",\\\"\"\ \'\{print\ \$1,\ \$3,\ \$4,\ \$5,\ \$9,\ \$14\}\'\ \|\ grep\ -v\ \"\#\"\ \|\ sed\ -e\ \'1d\'\ -e\ \'s/\\\"//g\'\ -e\ \'s/\\/\\/\\//\\t/g\'\ \|\ cut\ -f1-6,11\ \|\ sed\ -e\ \'s/\\/\\//\\t/g\'\ -e\ \'s/\ /\\t/g ### Test make .deb package