我正在尝试显示包含以下条目的文本文件中的段落:
<<<<<<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:如果您有有效案件,请告诉我。
答案 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/
,它可以确保忽略第一个空记录。
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