![](/img/trans.png)
[英]How to use if statement in awk, for a file which has date and other values in delimited format in linux
[英]How to Split a Delimited Text file in Linux, based on no of records, which has end-of-record separator in data fields
問題陳述:
我從Teradata卸載了一個分隔的文本文件,該文件恰好在數據字段中包含“ \\ n”(換行符或EOL標記)。
對於一個完整的行或記錄,在每個新行的末尾都使用相同的EOL標記。
我需要將此文件拆分為兩個或多個文件(基於我給出的記錄數),同時在數據字段中保留換行符,但要針對每行末尾的換行符。
例:
1|Alan
Wake|15
2|Nathan
Drake|10
3|Gordon
Freeman|11
期望值:
file1.txt
1|Alan
Wake|15
2|Nathan
Drake|10
file2.txt
3|Gordon
Freeman|11
我試過的
awk 'BEGIN{RS="\n"}NR%2==1{x="SplitF"++i;}{print > x}' inputfile.txt
代碼無法區分數據字段換行符和實際換行符。 有沒有辦法可以實現?
編輯::我已經改變了問題的例子。 請分享您對新示例的想法。
使用以下awk方法:
awk '{ r=(r!="")?r RS $0 : $0; if(NR%4==0){ print r > "file"++i".txt"; r="" } }
END{ if(r) print r > "file"++i".txt" }' inputfile.txt
NR%4==0
您的邏輯單行占用兩條物理記錄,因此我們希望每4條記錄分開 結果 :
> cat file1.txt
1|Alan
Wake
2|Nathan
Drake
> cat file2.txt
3|Gordon
Freeman
如果您使用的是GNU awk,則可以通過適當設置RS
來做到這一點,例如:
parse.awk
BEGIN { RS="[0-9]\\|" }
# Skip the empty first record by checking NF (Note: this will also skip
# any empty records later in the input)
NF {
# Send record with the appropriate key to a numbered file
printf("%s", d $0) > "file" i ".txt"
}
# When we found enough records, close current file and
# prepare i for opening the next one
#
# Note: NR-1 because of the empty first record
(NR-1)%n == 0 {
close("file" i ".txt")
i++
}
# Remember the record key in d, again,
# becuase of the empty first record
{ d=RT }
像這樣運行它:
gawk -f parse.awk n=2 infile
其中n
是要放入每個文件中的記錄數。
輸出:
file1.txt
1|Alan
Wake|15
2|Nathan
Drake|10
file2.txt
3|Gordon
Freeman|11
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.