如何用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###*/}”