给定一个文本文件,其中包含:
AF002 AI003 AA001 AD005 AD006 AI002 …
(由记录分隔符分隔)
生成包含以下内容的文本文件:
AF/AF002.jpg
AI/AI003.jpg
AA/AA001.jpg
AD/AD005.jpg
AD/AD006.jpg
AI/AI002.jpg
…
(由相同的记录分隔符分隔)
换句话说,从文件名的前两个字母推断路径,并附加 .jpg
另一个所需的功能是,由于我将处理大量此类文件,因此要测试输入文件中的前三个条目是否为 [AF][AZ][0-1]。这将防止我意外地将脚本应用到输出文件,因为第三个字符 (/) 会使测试失败。
我一直在尝试创建一个 AWK 脚本来在我的 iMac 上执行此操作,但似乎连最简单的操作都无法完成。我希望将脚本放在单独的命令文件中。我面临最后期限。
答案1
像这样 :
#!/bin/bash
str=$(<file)
for i in $str; do
if [[ $i =~ ^[A-F][A-Z][0-1] ]]; then
echo "${i:0:2}/$i.jpg"
fi
done
输出
AF/AF002.jpg
AI/AI003.jpg
AA/AA001.jpg
AD/AD005.jpg
AD/AD006.jpg
AI/AI002.jpg
答案2
尝试这个,
awk '{for (i=1;i<=NF;i++) print substr($i,1,2)"/"$i".jpg" }' file.txt
AF/AF002.jpg
AI/AI003.jpg
AA/AA001.jpg
AD/AD005.jpg
AD/AD006.jpg
AI/AI002.jpg
for
循环每个字段。substring
打印每个字段的前 2 个字符。
答案3
perl -pne "s/ /\n/g" p| awk '{print substr($1,1,2)"/"$0".jpg"}'
输出
AF/AF002.jpg
AI/AI003.jpg
AA/AA001.jpg
AD/AD005.jpg
AD/AD006.jpg
AI/AI002.jpg
答案4
假设这separated by record separators
意味着您的输入字符串实际上是换行符分隔的:
$ awk '/^[A-F][A-Z][0-1]/{print substr($0,1,2) "/" $0 ".jpg"}' file
AF/AF002.jpg
AI/AI003.jpg
AA/AA001.jpg
AD/AD005.jpg
AD/AD006.jpg
AI/AI002.jpg
如果没有,则使用 GNU awk 进行多字符 RS:
$ awk -v RS='[[:space:]]+' '/^[A-F][A-Z][0-1]/{print substr($0,1,2) "/" $0 ".jpg"}' file
AF/AF002.jpg
AI/AI003.jpg
AA/AA001.jpg
AD/AD005.jpg
AD/AD006.jpg
AI/AI002.jpg
或者使用任何 awk 选择:
$ awk -v RS=' ' '/^[A-F][A-Z][0-1]/{sub(/\n/,""); print substr($0,1,2) "/" $0 ".jpg"}' file
AF/AF002.jpg
AI/AI003.jpg
AA/AA001.jpg
AD/AD005.jpg
AD/AD006.jpg
AI/AI002.jpg
$ awk '{for (i=1;i<=NF;i++) if ($i ~ /^[A-F][A-Z][0-1]/) print substr($i,1,2) "/" $i ".jpg"}' file
AF/AF002.jpg
AI/AI003.jpg
AA/AA001.jpg
AD/AD005.jpg
AD/AD006.jpg
AI/AI002.jpg
$ tr ' ' $'\n' < file | awk '/^[A-F][A-Z][0-1]/{print substr($0,1,2) "/" $0 ".jpg"}'
AF/AF002.jpg
AI/AI003.jpg
AA/AA001.jpg
AD/AD005.jpg
AD/AD006.jpg
AI/AI002.jpg