如何从csv文件中的文件名中删除路径

时间:2015-07-17 08:34:39

标签: linux csv

我有一个完整的csv文件,如下所示:      8 ;;

Grote schoudertas遇到gekleurde borduursels& nbsp“Twee Hanen”

德意志是gemaakt van een stijf vilt met een dikte van 4 mm waardoor deze goed zijn vorm houdt
Aan de achterkant heeft de tas een vak met ritssluiting
de voering van de tas is van stof
Binnenin is een afsluitbaar vak met een rits
Ook is er een vak voor de telefoon
De tas is ruim en praktisch

AFMETINGEN:

Hoogte遇到了手艺:46厘米(星巴特7厘米)
Hoogte:34厘米
在midten中的Breedte:42厘米左右Bodemmaat:30 x 10厘米& nbsp
Schouderriem lengte instelbaar面包车55厘米总长130厘米
Gebruikte materialen:vilt en kunstleer
Productiemethode:handwerk < /p>;56.95; Vilten tas在kleur http://staging.tassenmagazijn.nl/media/catalog/product/cache/0/image/a94bc919ee025799dd7ec1f1b7884918/1/0/10_vilten_tas_2b_2.jpg;http://staging.tassenmagazijn.nl/media/catalog/product/2/0/10_vilten_tas_2c_1.jpg;http://staging.tassenmagazijn.nl/media/catalog/product/2/0/10_vilten_tas_2d_1.jpg;;;;;;;Fixed;New;Send;True遇到了twee hanen;

包含的文件是完整路径,我只想要文件名。

所以http://staging.tassenmagazijn.nl/media/catalog/product/cache/0/image/a94bc919ee025799dd7ec1f1b7884918/1/0/10_vilten_tas_2b_2.jpg;变成10_vilten_tas_2b_2.jpg;

正如您所看到的,路径的结构并不总是相同的。我可以使用某种linux命令吗?

3 个答案:

答案 0 :(得分:1)

假设您的所有路径都是http:// <Startup> / <anything>,那么

<filename>

将改变例如:

sed 's~http://.*/~~' <file>

http://staging.tassenmagazijn.nl/media/catalog/product/cache/0/image/a94bc919ee025799dd7ec1f1b7884918/1/0/10_vilten_tas_2b_2.jpg

答案 1 :(得分:0)

这在很大程度上取决于你的shell及read可用的工具,直到分隔符,';'在这种情况下。如果你有BASH或类似的shell,那么解决方案很简单子串删除

#!/bin/bash

while read -d ';' -r line; do
    ((${#line} >= 12)) && [[ $line =~ http ]] &&
    printf "%s\n" ${line##*/}
done < "$1"

如果你只限于POSIX shell,那么解决方案需要花费更多的工作,一旦隔离,你将在sed中继来解析URL。从包含由分号分隔的多个URL的行中隔离每个URL有点棘手。在POSIX shell中,你基本上不得不每行阅读一次读取一个字符(这对大文件来说很慢)以下验证每行被视为一个URL在开头包含http

#!/bin/sh

url=""
while read -r line; do 
    len=`expr length "$line"`
    urlstart=`expr index "$line" "h"`
    line=`expr substr "$line" "$urlstart" "$len"`
    while [ $len -gt 0 ]; do 

        c=`expr substr "$line" 1 1`

        if [ x$c = 'x;' ]; then
            if [ `expr length "$url"` -ge 12 ]; then
                # printf "url: %s\n" "$url"
                ulen=`expr length "$url"`
                urlstart=`expr index "$url" "h"`

                if [  $urlstart -gt 0 ]; then

                    if [ $urlstart -gt 1 ]; then
                        url=`expr substr "$url" "$urlstart" "$ulen"`
                    fi
                    urlflag=0

                    while [ `expr substr "$url" 1 4` != http ]; do
                        url=`expr substr "$url" 2 "$ulen"`
                        urlstart=`expr index "$url" "h"`
                        if [ "$urlstart" -eq 0 ]; then
                            urlflag=1
                            break
                        fi
                        url=`expr substr "$url" "$urlstart" "$ulen"`
                        ulen=`expr length "$url"`
                        if [ $ulen -le 12 ]; then
                            urlflag=1
                            break
                        fi
                    done

                    if [ $urlflag -ne 1 ]; then
                        if [ `expr substr "$url" 1 4` = http ]; then 
                            echo "$url" | sed -e 's/http.*\///'
                        fi
                    fi

                fi
            fi
            url=""

        else
            url="$url$c"
        fi
        line=`expr substr "$line" 2 "$len"`
        len=`expr length "$line"`
    done
done <"$1"

如果您可以确保只有长于某个常量的行是URL,那么您可以通过不搜索和验证包含http的每个字符串来显着提高POSIX解决方案的性能。要根据长度解析URL,类似于以下内容将起作用:

#!/bin/sh

while read -r line; do 

    printf "\n%s\n\n" "$line"
    len=`expr length "$line"`
    sidx=`expr index "$line" ";"`

    while [ $len -gt 0 ]; do 

        if [ $sidx -gt 0 ]; then 
            let end=sidx-1
            str=`expr substr "$line" 1 "$end"`
            slen=`expr length "$str"`
            if [ $slen -gt 12 ]; then
                echo "$str" | sed -e 's/^.*\///'
            fi
        else
            if [ $len -gt 12 ]; then
                echo "$line" | sed -e 's/^.*\///'
            fi
            break;
        fi

        let start=sidx+1
        line=`expr substr "$line" "$start" "$len"`

        len=`expr length "$line"`
        sidx=`expr index "$line" ";"`

    done

done <"$1"

12的长度只是作为jpeg文件的最短网址得出(例如http://a.jpg

在所有情况下,您给出的示例文件的结果都相同:

<强>输入

$ cat dat/httppaths.txt
;56.95;Vilten tas met twee hanen in kleur http://staging.tassenmagazijn.nl/\
media/catalog/product/cache/0/image/a94bc919ee025799dd7ec1f1b7884918/1/0/10_vilte\
n_tas_2b_2.jpg;http://staging.tassenmagazijn.nl/media/catalog/product/2/0/10_vilte\
n_tas_2c_1.jpg;http://staging.tassenmagazijn.nl/media/catalog/product/2/0/10_vilte\
n_tas_2d_1.jpg;;;;;;;Fixed;New;Send;True;

使用/输出

$ sh parsehttppath.sh dat/httppaths.txt
10_vilten_tas_2b_2.jpg
10_vilten_tas_2c_1.jpg
10_vilten_tas_2d_1.jpg

答案 2 :(得分:0)

尝试这样的事情:

cat file.txt | grep jpg | grep http | grep "/" | awk -F "/" '{ for(i = 1; i <= NF; i++) if ($i ~ "jpg") {print $i} }' | awk -F ";" '{print $1}' | xargs
  • 我对jpg后缀和http ...
  • 做了一些假设