2016-07-08 28 views
3

我必須在txt文件中打印出一些值。 他們是按以下格式如何在打印到shell中的文本文件時保留新行?

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可能包含新行。無論何時發生這種情況,cut或awk都不會讀取字段4,並將其視爲新行。請幫助我如何從給定的輸入格式打印兩個字段(保留新行)。

+0

字段數是否固定?你對@tripleee的評論意味着沒有。我問的原因是,否則似乎沒有一個字段分隔符。在第一個示例中,您在字段之間顯示分號,但在第二個示例中,您顯示換行符。如果一個換行符是一個字段分隔符,並且你不知道有多少個字段,那麼如何判斷一個字段結束並且下一個字段開始? – cdarke

+0

@cdarke輸入有「;」作爲分隔符,我現在必須將其轉換爲用新行分隔的輸出,同時還保留原始換行符。正如你可以看到Field1,Field2在彼此之下,所以它與多少個字段無關。例如,Field1:xxx \ n yyy Field2:zzzz \ n aaaa 它應該打印xxx \ n yyy \ n zzzz \ n aaaa – CoderBC

+0

嗯,好的,所以輸入字段分隔符是一個分號。 – cdarke

回答

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到一個空行,而不是換行。

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

這不適用於字段值中嵌入的換行符,因爲默認情況下Awk一次讀取一行。 – tripleee

+0

是的沒錯,現在看到更新的回覆。 – anubhava

+0

@anubhava如果兩個換行符在一起,那麼它仍然會中斷。 – 123

3

如果精心形成的輸入,你可以收集輸入行,直到你有四個字段。

awk -F ';' 'r { $0 = r ORS $0 } 
    NR<4 { next } 
    { print $1 "-" $2 
     print "FIELDS ALLOCATED:" 
     print $3; print $4 
     print ""; r="" }' file 
+0

'$ 0 = r'意味着什麼?如果輸入可以有幾個字段FIELD1,FIELD2,FIELD3,我們不能確定有多少? – CoderBC

+0

賦值'$ 0 = r ORS $ 0'將當前行粘貼到'r'的末尾,前面有換行符,並重新計算字段計數;所以我們在'r'中收集行,直到它包含四個字段。 – tripleee

+0

如果您不知道有多少個字段,其中一些可能包含換行符,則無法解析數據,因爲格式不明確。也許有例如一種模式可以讓我們識別最後一個字段的第一個字段,但是根據您提供的信息,您的問題無法在可變字段長度下解決。 – tripleee

1

只是改變awk輸入記錄分隔符 - RS。爲了清晰起見,在每個字段周圍添加了> <和>。

編輯:通過添加';'刪除多餘的尾部換行符在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> 
+1

爲什麼field2在最後有一個額外的換行符? – 123

+0

不知道是否它的here-doc或'awk',好點(編輯)。 – cdarke

+0

這不是這裏的字符串。必須是awk。 – 123

相關問題