如何用Awk解析其名称中带空格的文件

时间:2011-08-12 21:14:04

标签: 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,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]包含空格,例如something here~...

现在,我有一堆看起来像这样的文件:

R1~blah~blahblah...VERR 4~blah~blahblah...VER

我想将findfind . -name "R*VER"修改为find . -name "* *",但这将排除文件名中没有空格的所有文件。

最有效的方法是什么?

2 个答案:

答案 0 :(得分:2)

Internal Field Separtor variable, $IFS设置为换行符,而不是空格。例如:

#!/bin/sh
filenames=`ls`
IFS=$'\n'
for fname in $filenames ; do
    echo "$fname: "
    awk '{print $0}' $fname
done

答案 1 :(得分:0)

如何将变量包含在命令行中,如:

awk ... base="$fname"

但是,不知道代码中的其他##*/是什么。也许一些bash扩展...... 如果您确定没问题,请将它全部用双引号括起来:

base="${fname##*/}"