如何在shell中打印文本文件时保留新行?

时间:2016-07-08 06:27:46

标签: shell awk

我必须在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个字段并将其视为新行。如何帮助我如何从给定的输入格式打印两个字段(保留新行)。

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更改为空行而不是换行符。