![如何使用 AWK 始终打印具有一定位数的输出](https://linux22.com/image/156908/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20AWK%20%E5%A7%8B%E7%BB%88%E6%89%93%E5%8D%B0%E5%85%B7%E6%9C%89%E4%B8%80%E5%AE%9A%E4%BD%8D%E6%95%B0%E7%9A%84%E8%BE%93%E5%87%BA.png)
我有以下命令:
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/ParsingLs和https://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 非常脆弱。埃德的解决方案要好得多。