AWK系统()使用/ Variable调用

时间:2014-09-13 00:41:38

标签: bash awk

我正在尝试显示包含以下条目的文本文件中的段落:

<<<<<<o01o>>>>>>
CLAUSEID:000116
COMMENTS:
GENRES:
KEYWORDS:
LAST UPDATE:201405171224
CREATION DATE:201405171224
CLAUSE:VARIABLE MULTI 
LINE PARAGRAPH 
STARTS HERE 
<<<<<<o01o>>>>>>
CLAUSEID:000117
COMMENTS:
GENRES:
KEYWORDS:
LAST UPDATE:201405171224
CREATION DATE:201405171224
CLAUSE:THIS CAN BE ANY NUMBER 
OF LINES

我想要做的是标出第一个字段,显示字段8直到结束 记录然后暂停我输入任何内容继续..

awk 'BEGIN{RS="<<<<<<o01o>>>>>>";FS="\n"};{system("banner " $2); for(i=8;i<NF;i++) print $i; system("read i;clear")}' auto_contract_data1.txt

更新:问题是这只会在横幅的第一条记录上给出错误,其余条目只能看到CLAUSEID:0而不是正确的值。

最终解决方案:awk 'BEGIN{RS="<<<<<<o01o>>>>>>";FS="\n"} /CLAUSEID/{system("banner " substr($2,10)); for(i=8;i<NF;i++) if(i==8) print substr($i,8);else print $i; system("read i;clear")}' auto_contract_data1.txt

@EdMorton:我测试了关于字符串字符的理论,它仍然完美无瑕,这是我使用的数据:

<<<<<<o01o>>>>>>
CLAUSEID:0001.1^@6
COMMENTS:
GENRES:
KEYWORDS:
LAST UPDATE:201405171224
CREATION DATE:201405171224
CLAUSE:VARIAB*LE MULTI 
LINE PAR-AG&RAP?H 
STARTS HERE 
<<<<<<o01o>>>>>>
CLAUSEID:000117
COMMENTS:
GENRES:
KEYWORDS:
LAST UPDATE:201405171224
CREATION DATE:201405171224
CLAUSE:THI$ CAN BE ^%#(*#$NY NUMBER 
OF LINE-.?S

@EdMorton:如果您有有效案件,请告诉我。

2 个答案:

答案 0 :(得分:0)

$1为空,因为记录分隔符<<<<<<o01o>>>>>>后面紧跟着字段分隔符\n。尝试:

RS="<<<<<<o01o>>>>>>\n"

这样,$1将是RS之后的行。

或者,您可以使用banner $2。但是,由于只显示10个字符,请考虑:

awk 'BEGIN{RS="<<<<<<o01o>>>>>>";FS="\n"} /CLAUSEID/{system("banner " substr($2,10)); for(i=8;i<NF;i++) print $i; system("read i;clear")}' auto_contract_data1.txt

还要注意新条件/CLAUSEID/,它可以确保忽略第一个空记录。

A.Danischewski的进一步改进:

awk 'BEGIN{RS="<<<<<<o01o>>>>>>";FS="\n"} /CLAUSEID/{system("banner " substr($2,10)); for(i=8;i<NF;i++) if(i==8) print substr($i,8);else print $i; system("read i;clear")}' autocontract.txt

答案 1 :(得分:0)

这使用了awk擅长的功能(即文本操作,如选择字段,子串等)和shell,以获得它擅长的功能(对awk,banner等工具进行排序调用)。并阅读用户输入):

awk '
BEGIN{ RS="<<<<<<o01o>>>>>>"; FS="\n" }
NF {
    sub(/[[:space:]]+$/,"")
    print "HDR", substr($2,10)
    print "TXT", substr($8,8)
    for(i=9;i<=NF;i++) {
        print "TXT", $i
    }
}' file |
while read -r type line
do
    case $type in
        HDR ) read i < /dev/tty; banner "$line" ;;
        * )   printf "%s\n" "$line" ;;
    esac
done