Как разобрать файл с пробелом в его имени с помощью Awk - PullRequest
2 голосов
/ 13 августа 2011

Я создал скрипт, который разбивает имена файлов на компоненты для вставки базы данных:

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...VER и R 4~blah~blahblah...VER

Я хочу изменить find с find . -name "R*VER" на find . -name "* *", но это исключит все файлы без пробелов в имени файла.

Какой самый эффективный способ сделать это?

Ответы [ 2 ]

2 голосов
/ 13 августа 2011

Установите для переменной Internal Field Separtor, $ IFS , новую строку, а не пробел. Пример:

#!/bin/sh
filenames=`ls`
IFS=$'\n'
for fname in $filenames ; do
    echo "$fname: "
    awk '{print $0}' $fname
done
0 голосов
/ 13 августа 2011

Как насчет включения переменной в командную строку, например:

awk ... base="$fname"

Не знаю, что делает этот дополнительный ##*/ в вашем коде. Может быть, какое-то расширение bash ... Если вы уверены, что все в порядке, заключите все в двойные кавычки:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...