【问题标题】:Trim file names to initials, swap fields and pad numbers with Awk使用 Awk 将文件名修剪为首字母、交换字段和填充数字
【发布时间】:2021-09-18 07:42:05
【问题描述】:

尝试在一堆文件中运行这些操作:

 1. Swap field position and pad numbers if necessary
 2. Trim file name fields to initials
 3. Adjust -

一个最小的例子是这样的;

从此:

01 - Some - Else - Edu.txt
02 - Some thing - Else where - Edu.txt
3 - SOME THING - ELSE WHERE - Edu.txt

到这里:

S-E - 01 - Edu.txt
St-Ew - 02 - Edu.txt
ST-EW - 03 - Edu.txt

如何使用 (g)awk(或与其他工具结合使用,如果需要)??

【问题讨论】:

  • 欢迎来到 SO,请在您的问题中以代码的形式添加您的努力,谢谢
  • perl -e 'for(@ARGV){($n,$m,$s)=/^(\d+) +- +(.*)(- .*)$/ or next; $m=~s/(.).*? +/$1/g; rename$_,sprintf"$m - %02d $s",$n}' *.txt
  • @jhnc 谢谢先生,我也在尝试对 perl 的重命名做一些事情,但是我无法正确理解文档极大地限制了我的努力,我也厌倦了阅读让我无处可去的基本示例.
  • m// 以上可以接受无效输入。正则表达式应为/^(\d+) +- +(.* )(- .*)$/(即,在第一个.* 之后添加显式空格)。如果后续的 s/// 没有看到尾随空格,这可以避免输出错误。例如:01 - Some - Else- Edu.txt 应被忽略,但使用原始正则表达式将变为 S-Else - 01 - Edu.txt

标签: awk


【解决方案1】:

创建tst.awk 文件:

$ cat tst.awk 
    {if(NF=="7") printf "%s-%s - %02d - %s\n", substr($3,1,1), substr($5,1,1), $1, $7
     if(NF=="9") printf "%s%s-%s%s - %02d - %s\n", substr($3,1,1), substr($4,1,1), substr($6,1,1), substr($7,1,1), $1, $9}

bash 单线

$ for file in *Edu.txt ; do newfilename=`awk -f tst.awk <<<"$file"`; echo mv "$file" "$newfilename"; done
  • 注意echomv 之前是为了安全地预览生成的命令。删除 echo 以运行实际的 mv 命令。
  • awk.tst 的创建是为了保持终端屏幕清洁并用于以后的修改。所以在终端中你只在one-liner 中运行awk.tst 文件而不是整个awk 代码
  • 这适用于给定的示例文件模式。如果有任何文件在- 之间包含两个以上的单词,那么只需在awk 文件中添加if 条件行作为NF=="#"# 是每个空格之间的单词数并相应地编辑printf 格式.

以下是当前工作目录之前中的内容列表:

$ find .
.
./tst.awk
./01 - Some - Else - Edu.txt
./02 - Some thing - Else where - Edu.txt
./3 - SOME THING - ELSE WHERE - Edu.txt

结果输出

$ find .
.
./tst.awk
./S-E - 01 - Edu.txt
./St-Ew - 02 - Edu.txt
./ST-EW - 03 - Edu.txt

其他方法请参见此处AWK, SED, REGEX to rename files

【讨论】:

  • 看起来不错,你能解释一下如何直接在文件中使用它,而不是输入文件吗?
  • 您的意思是“应用于目录下的文件而不是一个文件”还是“应用于匹配文件中的特定行”,请添加更多细节并分享一些示例以便更好地理解。
  • @AhmetSaidAkbulut“应用于目录下的文件而不是一个文件”正是这样
  • @RenatoD.O.这能回答你的问题吗?
  • 在第 1 行出现语法错误({if(NF=="7") 旁边的意外标记),但我确实接受了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 2021-08-07
相关资源
最近更新 更多