如何使用 AWK 始终打印具有一定位数的输出

如何使用 AWK 始终打印具有一定位数的输出

我有以下命令:

find . -mtime -5 -type f -exec ls -ltr {} \; | awk '{print "cp -p "$9" "$7}'

输出如下:

cp -p ./18587_96xxdata.txt 10
cp -p ./16947_96xxdata.txt 8
cp -p ./32721_96xxdata.txt 9
cp -p ./32343_96xxdata.txt 9
cp -p ./32984_96xxdata.txt 10

但我希望输出的最后部分始终为 2 位数字,例如:

cp -p ./18587_96xxdata.txt 10
cp -p ./16947_96xxdata.txt 08
cp -p ./32721_96xxdata.txt 09
cp -p ./32343_96xxdata.txt 09
cp -p ./32984_96xxdata.txt 10

我尝试了不同的变体%02d,但没有得到我想要的。

这是我尝试过的一个:

find . -mtime -5 -type f -exec ls -ltr {} \; | awk '{print "cp -p " $9 " "("%02d", $7)}' 

我应该使用 吗printf?如果是,具体如何使用?

谢谢你!

答案1

https://mywiki.wooledge.org/ParsingLshttps://mywiki.wooledge.org/Quotes然后这样做:

$ find . -mtime -5 -type f -printf "cp -p '%p' '%Ad'\n"
cp -p './bbbb.csv' '09'
cp -p './cccc.csv' '10'
cp -p './out1.txt' '09'
cp -p './out2.txt' '05'

答案2

是的,printf是你的朋友。用于%.2d将数字用 0 填充为 2 位:

find . -mtime -5 -type f -exec ls -ltr {} \; | 
    awk '{printf "cp -p %s %.2d\n", $9, $7}'

为了说明这一点,我在包含原始输出的文件上运行了以下命令:

$ cat file
cp -p ./18587_96xxdata.txt 10
cp -p ./16947_96xxdata.txt 8
cp -p ./32721_96xxdata.txt 9
cp -p ./32343_96xxdata.txt 9
cp -p ./32984_96xxdata.txt 10
$ awk '{printf "%.2d\n", $NF}' file
10
08
09
09
10

请注意非常好的一点由@edmorton提出。解析 ls 非常脆弱。埃德的解决方案要好得多。

相关内容