2016-03-15 3 views
0

Я попытался использовать это:Как извлечь имя файла без файла с использованием AWK расширением

awk 'END{ var=FILENAME; n=split (var,a,/\//); print basename a[n]}' 

и она возвращается полный путь.

Кто-нибудь знает, как получить результат без расширения?

Пример: D:\Test\test.tested.txt ->test

использованием awk?

ответ

0
$ echo "D:\Test\test.tested.txt" | 
    awk '{n=split($1,a,"\\"); split(a[n],b,"."); print b[1]}' 

test 

для сценария

... END{n=split(FILENAME,a,"\\"); split(a[n],b,"."); print b[1]}' 
+0

Спасибо @karakfa. это работает – Bams

0

Попробуйте ответить ниже.

awk 'END {var = FILENAME; n = split (var, a, ///); print a [n]} 'D: \ Test \ test.tested.txt | awk -F "." {Печать $ 1} '

0

AWK ниже код делает то, что вы хотите:

!uniq[FILENAME]++ { 
    aux[++k] = FILENAME; 
    next; 
} 
END { 
    for(i = 1; i <= k; i++) 
    { 
     a = split(aux[i], x, "."); 
     print x[1]; 
    } 
} 

В качестве одного лайнера:

!uniq[FILENAME]++{aux[++k] = FILENAME; next;} END {for(i = 1; i <= k; i++) {a = split(aux[i], x, "."); print x[1];}} files 

next, по крайней мере, на моей машине, дает небольшое быстрее, чем опустить его из кода.

Примечание: Приведенный выше код дает вам отсортированный вывод в соответствии с порядком файлов, которые Вы передаете к нему, то есть, если вы даете ему файлы file01.txt file02.txt data01.txt, они будут отсортированы в том же порядке:

file01 
file02 
data01 

Более короткий вариант этого же кода будет:

!filename[FILENAME]++ { 
     next; 
} 
END { 
     for(i in filename) 
     { 
       a = split(i, x, "."); 
       print x[1]; 
     } 
} 

в качестве одного лайнера:

!filename[FILENAME]++ {next;} END {for(i in filename) {a = split(i, x, "."); print x[1];}} files 

Результат не отсортирован в каком-либо смысле. Это зависит от пользователя.

Смежные вопросы