![将当前日期插入文件的空列(字段)的位置](https://linux22.com/image/108883/%E5%B0%86%E5%BD%93%E5%89%8D%E6%97%A5%E6%9C%9F%E6%8F%92%E5%85%A5%E6%96%87%E4%BB%B6%E7%9A%84%E7%A9%BA%E5%88%97%EF%BC%88%E5%AD%97%E6%AE%B5%EF%BC%89%E7%9A%84%E4%BD%8D%E7%BD%AE.png)
我有一个包含四列的文件,以“|”分隔如下
23414|test doc for me||
32322|test doc for you|2004_12_03|
13454|test doc for all||2010_11_01
我正在尝试将当前系统日期插入到空列中,以便输出应如下所示
23414|test doc for me|2018_04_03|2018_04_03
32322|test doc for you|2004_12_03|2018_04_03
13454|test doc for all|2018_04_03|2010_11_01
下面是我尝试过的代码
for file in `ls -rlt Added_to_* | awk '{print $9}'`
do
now="$(date +'%Y/%m/%d')"
echo "Running for: $file"
awk -F'|' -v curr="$now" '{
if( $3=="" || $4=="" ){
if ( $3=="" ) { print "$curr"}
if ( $4=="" ) { print "$curr"}
}else
do_something ;
}' $file
done
答案1
首先,根本不需要解析输出ls
,甚至不需要使用 shell 循环 - 因为awk
可以读取和处理文件列表。
另一个问题是你引用传递的变量的方式:$curr
应该只是curr
($curr
指的是字段编号 curr
- 如果这样的事情存在的话)。此外,无需两次测试字段是否为空。
所以
awk -v curr="$now" '
BEGIN{OFS=FS="|";} {for(i=3;i<=4;i++) {if ($i=="") $i=curr}} {print}
' Added_to_*
答案2
我们使用lookbehind/lookahead正则表达式将发生替换的POI(感兴趣的位置)归零。到达那里后,我们使用Perl's
内置函数放置当前日期localtime
。第三、第四和第五字段是日/月/年信息,我们向其中添加所需的常量以获得今天的日期。我们在年份中添加1900
, 到月份 1,以及 0 到日期,
perl -ple 's/\|\K(?=\||$)/join "_", map $_ + qw[1900 1 0][$a++%3], (localtime)[5,4,3]/eg'
答案3
sed ":a;s/|\(|\|$\)/|$(date +%Y_%m_%d)\1/;ta"
正如科斯塔斯所说
应该对你有帮助。
附言。对不起。看起来您没有使用双破折号进行分割。让我想想...