Unix shell 脚本将文件中的日期填充为文件中的第一列

Unix shell 脚本将文件中的日期填充为文件中的第一列
  1. 我有一个文件名abc.dat,其中包含第一条记录,如下所示
    01|06/30/2020|test.txt. 
    
  2. 文件的其余部分包含如下记录
    123456|Alpha|....... 
    134567|Beta|.... 
    ................
    
  3. 现在,我需要从文件中获取06/30/2020第一条记录并将其转换为MMDDYYYY类似格式06302020,并将其作为文件中除第一条记录之外的第一列。
  4. 输出:预期输出如下
    01|06/30/2020|test.txt 
    06302020|123456|Alpha|..........
    06302020|134567|Beta|...........
    ................................
    
  5. 我尝试使用以下代码
    for file in `ls abc.dat`
    do
        #Gets filename for each row
        # echo "file = $file"
        rec=`wc -l $file`
        rec_cnt=`echo $rec | cut -f1 -d" "`
        #echo "Record Count = $rec_cnt"
        #extract the month end date from the first line from file
        month_end_date=`head -1 $file|tr -d '/'|cut -f2 -d"|"`
        #echo "month end date is $month_end_date"
        awk -F"|" '{if(NR == 1) printf ("%s\n",$0)
            else{ if ('$month_end_date' == $1) printf("%s\n",$0)
                else printf ("%s|%s\n",'$month_end_date',$0)} }'
    done
    

答案1

请注意,很少需要awk在 shell 循环中调用,因为它本身可以将多个文件作为命令行参数处理。另外,循环内容读取文件并传递单独的行的效率极低,因此不鼓励这样做。

实际上,可以将整个功能实现为一个awk程序:

awk '
    BEGIN {OFS=FS="|"}
    FNR==1 {d=gensub("/","","g",$2); print;}
    FNR>1 {print d,$0}
' abc.dat

解释:

  • 在每个文件的第一行,这使用该gensub()函数创建第二个字段(包含日期)的副本,其中所有字段/都替换为空字符串(即删除)。
  • 在所有后面的行中,此修改后的副本将添加到原始行内容之前。

相关内容