我有一個 csv 表,其中有一列包含以天為單位的日期差異作為整數值,我想將檔案拆分為 30 天間隔,這樣第一個檔案包含列值為 0-30 的行,第二個檔案含 31-60,依此類推。如何使用 awk 或 split 命令來做到這一點?
樣本資料:
ID, creation date, answer date, difference in days
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 0
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 0
每當最后一列(difference in days)達到 30 時,我想拆分檔案,并將所有先前的行移到新檔案中。
我嘗試了這個 awk 命令,但結果不是我想要的:
awk -F, '{if($14 % 30 == 0) x="F" i;}{print > $14/30"months.csv"}' file.csv
uj5u.com熱心網友回復:
首先我建議在這里使用整數除法而不是增加-當-除法-均勻時,考慮以下順序
1 2 3 4 7 9 10 10
并說你正在劃分大小為 5 的區間,現在如果你增加-when-divides-evenly 那將給出
1 2 3 4 7 9 - 10 - 10
所以兩組被合并為一組,因為不5存在,另一組由于重復 10 而被分成兩組。使用整數除法會給出
1 2 3 4 - 7 9 - 10 10
簡單的GNUAWK實作file.txt
1,1
2,2
3,3
4,4
7,7
9,9
10,A
10,A
然后
awk '{print > "file" int($1/5) ".txt"}' file.txt
創建file0.txt控股
1,1
2,2
3,3
4,4
并file1.txt持有
7,7
9,9
并file2.txt持有
10,A
10,A
解釋:int(x/y)是整數除法,它先除然后取地板。
(在 GNU Awk 5.0.1 中測驗)
uj5u.com熱心網友回復:
awk -F, 'BEGIN{ i=0; x="F" i }{print > "months_"x".csv"}{if($4 % 30 == 0 && $4>0) x="F" i;}' input.csv
BEGIN{ i=0; x="F" i }初始化i和x{print > "months_"x".csv"}將行復制到“months_{x}.csv”,{if($4 % 30 == 0 && $4>0) x="F" i;}僅在復制該行后,檢查列(第 4 列)是否已達到 30,然后更改x.
注意:標題只會在第一個輸出檔案中(“months_F1.csv”)
使用此輸入:
ID, creation date, answer date, difference in days
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 0
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 0
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 30
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 0
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 0
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 30
將創建以下檔案:“months_F1.csv”
ID, creation date, answer date, difference in days
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 0
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 0
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 30
和“months_F2.csv”
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 0
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 0
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 30
uj5u.com熱心網友回復:
您沒有使用您定義的“x”變數。假設沒有必要您可以簡單地更改為,還假設感興趣的欄位是最后一個欄位
$ awk -F, '!$NF{$NF=1} {if(print > ( int(($NF-1)/30 1)"_months.csv" )}' file.csv
前 30 天將在檔案中1_months.csv,31-60 在檔案中等2_months.csv。如果月份過多,您可能需要修改腳本以關閉前幾個月。如果檔案是按日期排序的,它會更簡單。
第一部分是將 1 分配給第 0 天,因為第一部分的跨度為 31 天 (0-30),而其他部分為 30 (31-60)。
uj5u.com熱心網友回復:
樣本資料檔案.csv
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 0
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 1
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 2
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 30
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 32
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 33
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 34
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 65
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 65
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 66
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 67
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 91
拆分.awk
BEGIN {X=1; Y=30}
{
if($4 > Y) { X ; Y=X*30; };
if ($4 <= Y){ print $0 >X"-file.csv"}
}
運行這個:
gawk -F, -f split.awk file.csv
結果:
cat 1-file.csv
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 0
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 1
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 2
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 30
cat 2-file.csv
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 32
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 33
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 34
cat 3-file.csv
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 65
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 65
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 66
1190, 2017-10-24 13:57:15.91 UTC, 2017-10-24 15:14:00.53 UTC, 67
cat 4-file.csv
610, 2017-10-24 13:57:15.91 UTC, 2017-10-24 14:58:17.77 UTC, 91
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474936.html
