我需要從 julian(yyddd 或 yyJJJ)轉換為 yyyymmdd 的 csv 檔案的第 7 個欄位。我有以下 while do 回圈。我需要使用 awk 命令的相同邏輯來加快處理速度。有人可以幫忙嗎?
count=0
while read -r line1; do
col_7=$( echo $line1 | cut -d ',' -f7 | cut -c4-6)
year1=$( echo $line1 | cut -d ',' -f7 | cut -c2-3)
echo $col_7
col_1=$( echo $line1 | cut -d ',' -f1,2,3,4,5,6)
col_8=$( echo $line1 | cut -d ',' -f8 )
date7=$(date -d "01/01/${year1} ${col_7} days -1 day" %Y%m%d)
echo $date7
echo $col_1,$date7,$col_8 >> ${t2}
count=$[count 1]
done < ${t1}
輸入
xx,x,x,xxx,xxxx,xxxxx,021276,x
xx,x,x,xxx,xxxx,xxxxx,021275,x
xx,x,x,xxx,xxxx,xxxxx,021275,x
輸出
xx,x,x,xxx,xxxx,xxxxx,20211003,x
xx,x,x,xxx,xxxx,xxxxx,20211002,x
xx,x,x,xxx,xxxx,xxxxx,20211002,x
uj5u.com熱心網友回復:
只需消除所有的呼叫就cut可以創造奇跡;你可能不需要awk。
count=0
while IFS=, read -r c1 c2 c3 c4 c5 c6 c7 col_8 rest; do
col_7=${c7:3:3}
year1=${c7:1:2}
col_1=$c1$c2$c3$c4$c5$c6
col_8=$c8
date7=$(date -d "01/01/$year1 $col_7 days - 1 day" %Y%m%d)
...
count=$((count 1))
done < "$t1"
uj5u.com熱心網友回復:
這是一個解決方案awk。這需要GNU awk 的時間功能。在終端上對其進行了測驗,因此它幾乎是一個單行命令。
awk 'BEGIN { FS=OFS="," } { $7=strftime("%Y%m%d",mktime("20"substr($7,2,2)" 01 01 00 00 00") (substr($7,4)*86400)-3600) } 1' filename.txt
說明:
- FS 是欄位分隔符。將其設定為“,”
- OFS 是輸出欄位分隔符。將其設定為“,”
- $7 是第 7 個欄位。
- strftime(format, timestamp) 是一個內置函式,用于根據格式中的規范以秒為單位格式化時間戳。
- mktime(datespec) 是將 datespec 轉換為秒的函式。datespec 的格式是
YYYY MM DD HH MM SS. - substr($7,2,2) 是獲得兩位數的年份。
- substr($7,4) 是為了得到
day. 因為這些函式需要秒作為輸入,所以需要轉換為秒。 - 86400 是 24(小時)* 60(分鐘)* 60(秒)
- 36000是一天。60(分鐘)* 60(秒)
- 1 用于列印輸入行。不必為 1。零以外的任何值都可以。如果您喜歡 RPG,您可能希望將其更改為
999. - filename.txt 是您的輸入檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/432229.html
