How to use parameter with perl function?

am a beginer of shell Unix, plesase tell me how to get parameter with $perl in loop

$ perl -lne '$/="DOCEND";print $_."DOCEND" if /$ACC/' file_input > output

i can't get parameter in loop with perl fucntion like this

pass paramerter to $ACC not accept in this script

$ACC = paramerter to find in text file_input / Ex. $ACC = ("KRAI","MARK")

EX.file_input

DOCSTART
DFSDF
NAME FIRSTNAME
ADDRESS
DSAFFD
DOCEND
DOCSTART
VEDFDSF
NAME KRAI
ADDRESS
SDFDSG
DOCEND
DOCSTART
LOUI
NAME ROBERT
ADDRESS
GHHW
DOCEND
DOCSTART
YYUI
NAME MARK
ADDRESS
LKJL;
DOCEND
DOCSTART
SAFD
NAME BEN
ADDRESS
8OIP
DOCEND

I need out put from loop with $perl like below

output text file

DOCSTART
VEDFDSF
NAME KRAI
ADDRESS
SDFDSG
DOCEND
DOCSTART
LOUI
NAME MARK
ADDRESS
GHHW

Maybe like this ?

$
$
$ cat -n f4
     1  DOCSTART
     2  DFSDF
     3  NAME FIRSTNAME
     4  ADDRESS
     5  DSAFFD
     6  DOCEND
     7  DOCSTART
     8  VEDFDSF
     9  NAME KRAI
    10  ADDRESS
    11  SDFDSG
    12  DOCEND
    13  DOCSTART
    14  LOUI
    15  NAME ROBERT
    16  ADDRESS
    17  GHHW
    18  DOCEND
    19  DOCSTART
    20  YYUI
    21  NAME MARK
    22  ADDRESS
    23  LKJL;
    24  DOCEND
    25  DOCSTART
    26  SAFD
    27  NAME BEN
    28  ADDRESS
    29  8OIP
    30  DOCEND
$
$
$ perl -lne '$/="DOCEND"; print $_."DOCEND" if /MARK|KRAI/' f4
 
DOCSTART
VEDFDSF
NAME KRAI
ADDRESS
SDFDSG
DOCEND
 
DOCSTART
YYUI
NAME MARK
ADDRESS
LKJL;
DOCEND
$
$

Or this -

$
$ perl -lne 'BEGIN {$/="DOCEND"; $ACC="MARK|KRAI"} print $_."DOCEND" if /$ACC/' f4
 
DOCSTART
VEDFDSF
NAME KRAI
ADDRESS
SDFDSG
DOCEND
 
DOCSTART
YYUI
NAME MARK
ADDRESS
LKJL;
DOCEND
$
$

tyler_durden

am try to cut from your script but not work in my shell loop T_T

while read I
       do
         ACCT=`echo ${I} |awk -F'|' '{print $1}'`
         GMF=`echo ${I} |awk -F'|' '{print $2}'`
         perl -lne 'BEGIN {$/="DOCEND"; $ACCT} print $_."DOCEND" if /$ACCT/'  ${GMF}  > output 
done < listfile.txt

listfile.txt

 
 KRAI|file_name 
 MARK|file_name 

file_name = file_input

bcoz in my loop want to cut text file from DOCSTART to DOCEND of listfile.txt , and i used loop bcoz it had many ACCT(name of customer) in many file

by the way : script in one line can cut text or data (if i put the name to find direct in script)

but same script not work when i use in my shell loop :confused::confused:

please help me !!!!:frowning:

sorry !! am weak in english:o

In order to pass shell variables to a Perl one-liner, use double quotes instead of single quotes.

Have a look at the following testcase that I set up to mimic your scenario:

$
$ # list the contents of data files - "file_input1" and "file_input2"
$ cat file_input1
DOCSTART
DFSDF
NAME ADAM
ADDRESS
DSAFFD
DOCEND
DOCSTART
VEDFDSF
NAME KRAI
ADDRESS
SDFDSG
DOCEND
DOCSTART
YYUI
NAME MARK
ADDRESS
LKJL;
DOCEND
DOCSTART
SAFD
NAME BEN
ADDRESS
8OIP
DOCEND
$
$ cat file_input2
DOCSTART
DFSDF
NAME ADAM
ADDRESS
DSAFFD
DOCEND
DOCSTART
VEDFDSF
NAME KRAI
ADDRESS
SDFDSG
DOCEND
DOCSTART
YYUI
NAME MARK
ADDRESS
LKJL;
DOCEND
DOCSTART
LOUI
NAME ROBERT
ADDRESS
GHHW
DOCEND
$
$ # show what's in the list file
$ cat listfile.txt
KRAI|file_input1
MARK|file_input2
$
$ # display the content of the Bash shell script
$ cat getnameblock.sh
#!/usr/bin/bash
while read I
do
  ACCT=`echo ${I} |awk -F'|' '{print $1}'`
  GMF=`echo ${I} |awk -F'|' '{print $2}'`
  perl -lne "BEGIN {\$/=\"DOCEND\"} print \"\$_\",\"DOCEND\" if /$ACCT/"  ${GMF}
done < listfile.txt
$
$ # now execute the shell script
$ ./getnameblock.sh
 
DOCSTART
VEDFDSF
NAME KRAI
ADDRESS
SDFDSG
DOCEND
 
DOCSTART
YYUI
NAME MARK
ADDRESS
LKJL;
DOCEND
$
$

HTH,
tyler_durden

1 Like

:)thank a lot durden_tyler for script and knowledge:)