簡體   English   中英

如何在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM