Shell-Script

幫助 awk / sed shell 腳本

  • October 5, 2015

我必須使用下表中的資訊(假資訊)製作腳本

AnimalNumber,DOB,Gender,Breed,Date-moved-in
IE161289240602,04/02/2010,M,AAX,20/07/2011,
IE141424490333,13/01/2009,M,LMX,21/09/2010,
IE151424420395,19/01/2007,F,LMX,20/08/2010,

基本上我只需要列出出生日期,animalnumber但動物編號應該像這樣分解

IE161289240602應該1612892 4 0602

並且只應該列出出生的月份和年份,所以第一行是這樣的

Feb 2010 1412892 4 0602

關於如何做到這一點的任何想法?恐怕它有點超出我的技能範圍

對於GNU awk

awk -F, '
   NR>1{
       sub("..","")                   #remove first two letters (mean IE)
       d=""
       for(i=split($2,D,"/");i>0;i--) #format 2nd field into `YY MM DD` 
           d=d D[i] " "
       print strftime("%b %Y",mktime(d 0" "0" "0)),gensub("[0-9]"," & ",8,$1)
   }' file
  • mktime從 EPOCH 從格式的字元串生成時間戳(以秒為單位)YYYY MM DD HH MM SS
  • strftime以所需格式轉換時間戳(在這種情況下%b %Y
  • gensub將第一個欄位 ( ) 中的第一個8數字 ( )替換為自身 ( ) 並帶有尾隨空格[0-9]``$1``&

我們只看到字元串格式,因此可以使用sed

sed -r '
   1d
   s/./ & /10
   s|(../)(../)|\2\1|
   s/..([^,]*),([^,]*).*/date -d "\2" +"%b %Y \1"/e
   ' file

或者對於沒有e命令的sed

sed '
   1d
   s/./ & /10
   s|\(../\)\(../\)|\2\1|
   s/..\([^,]*\),\([^,]*\).*/date -d "\2" +"%b %Y \1"/
   ' file | bash

或者

sed '
   s/./ & /10
   s/../+"%b %Y /
   s/,/" -d /
   s|\(../\)\(../\)|\2\1|
   s/,/\n/
   1!P
   d' file | xargs -n3 date

引用自:https://unix.stackexchange.com/questions/233972