Как указать местоположение вывода файла в скрипте оболочки? - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть сценарий Shell, содержащий сценарий Perl и сценарий R.

мой сценарий оболочки R.sh:-

#!/bin/bash
./R.pl                               #calling Perl script
`perl -lane 'print $F[0]' /media/data/abc.cnv > /media/data/abc1.txt`;
                                     #Shell script
 Rscript R.r                         #calling R script

Это мой R.pl (руководитель):-

`export path=$PATH:/media/exe_folder/bin`;
print "Enter the path to your input file:";
$base_dir ="/media/exe_folder";
chomp($CEL_dir = <STDIN>);
opendir (DIR, "$CEL_dir") or die "Couldn't open directory $CEL_dir";
$cel_files = "$CEL_dir"."/cel_files.txt";
open(CEL,">$cel_files")|| die "cannot open $file to write";
print CEL "cel_files\n";
for ( grep { /^[\w\d]/ } readdir DIR ){

print CEL "$CEL_dir"."/$_\n";
}close (CEL);

Выходные данные сценария Perl являются входными данными для сценария Shell, а выходные данные оболочки - входными данными для сценария R.

Я хочу запустить сценарий оболочки, указав имя входного файла и выводимя файла, например: -

./R.sh  home/folder/inputfile.txt  home/folder2/output.txt

Если в папке много файлов, то для ее обработки потребуется только пользовательский файл.Есть ли способ сделать это?

1 Ответ

0 голосов
/ 08 февраля 2019

Полагаю, это то, что вы хотите:

#!/bin/bash
# command line parameters
_input_file=$1
_output_file=$2

# @TODO: not sure if this path is the one you intended...
_script_path=$(dirname $0)

# sanity checks
if [[ -z "${_input_file}"  ]] ||
   [[ -z "${_output_file}" ]]; then
    echo 1>&2 "usage: $0 <input file> <output file>"
    exit 1
fi
if [[ ! -r "${_input_file}" ]]; then
    echo 1>&2 "ERROR: can't find input file '${input_file}'!"
    exit 1
 fi

 # process input file
 # 1. with Perl script (writes to STDOUT)
 # 2. post-process with Perl filter
 # 3. run R script (reads from STDIN, writes to STDOUT)
 perl ${_script_path}/R.pl <"${_input_file}"      | \
     perl -lane 'print $F[0]'                     | \
     Rscript ${_script_path}/R.r >"${_output_file}"

 exit 0

Пожалуйста, смотрите примечания о том, как должны вести себя вызываемые скрипты.

ПРИМЕЧАНИЕ: Я не совсемпонять, почему вам нужно постобработать вывод сценария Perl с помощью фильтра Perl.Почему бы не интегрировать его непосредственно в сам скрипт Perl?


КОД БОНУСА: это то, как вы бы написали основной цикл в R.pl, чтобы он действовал как правильный фильтр, т. Е. Читалстроки от STDIN и запись результата в STDOUT.Вы можете использовать тот же подход и на других языках, например R.

#!/usr/bin/perl
use strict;
use warnings;

# read lines from STDIN
while (<STDIN>) {
    chomp;

    # add your processing code here that does something with $_, i.e. the line
    # EXAMPLE: upper case first letter in all words on the line
    s/\b([[:lower:]])/\U\1/;

    # write result to STDOUT
    print "$_\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...