如何用Awk解析名称中带有空格的文件
我创建了一个脚本,将文件名拆分为用于数据库插入的组件:如何用Awk解析名称中带有空格的文件,awk,Awk,我创建了一个脚本,将文件名拆分为用于数据库插入的组件: find . -name "R*VER" | while read fname do awk -v squote="'" -v base=${fname##*/} ' { split( base, a, "~" ); printf( "INSERT INTO REPORT (COL1,COL2,COL3,COL4,COL5,COL6,COL7,CO
find . -name "R*VER" | while read fname
do
awk -v squote="'" -v base=${fname##*/} '
{
split( base, a, "~" );
printf( "INSERT INTO REPORT (COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8)\n" );
str = sprintf( "VALUES (\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\")", base, a[1], a[2], a[3], a[7], a[8], a[9], a[10] );
gsub( "\"", squote, str ); # replace double quotes with singles
print str;
}'
done
直到今天,它一直很有效。新文件名引入了a[1]
包含空格的位置,例如somethine here~…
现在,我有一个混合的文件,看起来像这样:
R1~blah~blahblah…VER
和
r4~blah~blahblah…VER
我想修改find
中的find-名称“R*VER”
至查找-名称“**”
但这将排除文件名中没有空格的所有文件
执行此操作最有效的方法是什么?在命令行中封装变量,例如:
awk。。。base=“$fname”
但是,我不知道代码中附加的##*/
有什么作用。也许是一些bash扩展。。。
如果您确定没有问题,请将其全部用双引号括起来:
base=“${fname##*/}”
将设置为换行符,而不是空格。例如:
#!/bin/sh
filenames=`ls`
IFS=$'\n'
for fname in $filenames ; do
echo "$fname: "
awk '{print $0}' $fname
done
将awk脚本放在一个单独的文件中,并使用
find-名字-exec数据库_insert.sh{}\我不明白为什么这是个问题。是否要排除带有空格的名称?你想删除空格吗?嗯,我使用base=${fname##*/}
删除路径+目录名。Re${param###text}:看-这是GNU bash中非常有用的工具,如果很神秘的话。@Chris,好的,那么试试base=“${fname###*/}”