我必须在txt文件中打印出一些值。 它们具有以下格式
input="Sno;Name;Field1;Field2"
但输出必须是:
Sno-Name
FIELDS ALLOCATED:
Field1
Field2
我是这样做的:
echo $input | $(awk -F';' '{print $1"-"$2}') >>$txtfile
echo "FIELDS ALLOCATED:">>$txtfile
echo "$input" | cut -d';' -f 3,4 >>$txtfile
这很容易。但是,问题是Field1或Field2可以包含新行。每当发生这种情况时,剪切或awk不会读取第4个字段并将其视为新行。如何帮助我如何从给定的输入格式打印两个字段(保留新行)。
答案 0 :(得分:3)
如果输入格式正确,则可以收集输入行,直到有四个字段。
awk -F ';' 'r { $0 = r ORS $0 }
NR<4 { next }
{ print $1 "-" $2
print "FIELDS ALLOCATED:"
print $3; print $4
print ""; r="" }' file
答案 1 :(得分:2)
单gnu-awk
可以使用FPAT
完成工作并清空RS
:
input=$'Sno;Name;Field1\nFoo;Field2'
awk -v RS= -v FPAT='[^;]+' '{
printf "%s-%s\nFIELDS ALLOCATED:\n%s\n%s\n", $1, $2, $3, $4}' <<< "$input"
Sno-Name
FIELDS ALLOCATED:
Field1
Foo
Field2
答案 2 :(得分:1)
只需更改awk
- RS
中的输入记录分隔符即可。 &LT;和&gt;为清晰起见,在每个字段周围添加。
编辑:通过添加&#39;删除额外的尾随换行符;&#39;在here-doc数据的末尾加上另一个条件。
input="Sno;Name;Fie
ld1;Fi
eld2"
awk 'BEGIN{RS=";"} NR==1{f1=$0};
NR==2{print f1 "-" $0; print "FIELDS ALLOCATED:"}
$0=="\n"{next}
NR>2{print "<" $0 ">"}' <<< "$input;"
给出:
Sno-Name
FIELDS ALLOCATED:
<Fie
ld1>
<Fi
eld2>
答案 3 :(得分:0)
input=$'Sno;Name;Field1\nFoo;Field2'
awk 'BEGIN{ RS = "\n\n+" ; FS = ";" } { print $1"-"$2; for(i=3;i<=NF;i++) {print $i}}' <<<"$input"
由于它不知道我可以提供多少个字段,我添加了一个for循环直到NF并将RS更改为空行而不是换行符。