- 我有一个文件名
abc.dat
,其中包含第一条记录,如下所示01|06/30/2020|test.txt.
- 文件的其余部分包含如下记录
123456|Alpha|....... 134567|Beta|.... ................
- 现在,我需要从文件中获取
06/30/2020
第一条记录并将其转换为MMDDYYYY
类似格式06302020
,并将其作为文件中除第一条记录之外的第一列。 - 输出:预期输出如下
01|06/30/2020|test.txt 06302020|123456|Alpha|.......... 06302020|134567|Beta|........... ................................
- 我尝试使用以下代码
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()
函数创建第二个字段(包含日期)的副本,其中所有字段/
都替换为空字符串(即删除)。 - 在所有后面的行中,此修改后的副本将添加到原始行内容之前。