簡體   English   中英

如何從csv文件中的文件名中刪除路徑

[英]How to remove path from filename in a csv-file

我有一個完整的csv文件,其內容如下:8 ;;

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

De tas is gemaakt van een stijf vilt met een een dikte van 4毫米waardoor deze goed zijn vorm houdt
Aan de achterkant heeft de tas een vak met ritssluiting
范德塔斯是范斯托夫
Binnenin是青少年和青少年
Ook is er een vak voor de telefoon
De tas is ruim en praktisch

AFMETINGEN:

霍格遇見過手:46厘米(verstelbaar 7厘米)
Hoogte:34厘米
Brette in het midden:42厘米
Bodemmaat:30 x 10厘米
Schouderriem Lengte Instelbaar貨車55厘米tot 130厘米
Gebruikte materialen:vilt en kunstleer
生產方法:handwerk

; 56.95; Vilten tas在kleur中遇到了twee hanen http://staging.tassenmagazijn.nl/media/catalog/product/cache/0/image/a94bc919ee025799dd7ec1f1b7884918/1/0/10_vilten_tas_2b_2.jpg;http://staging.tassenmagazijn NL /媒體/目錄/產品/ 2/0 / 10_vilten_tas_2c_1.jpg; HTTP://staging.tassenmagazijn.nl/media/catalog/product/2/0/10_vilten_tas_2d_1.jpg ;;;;;;;固定;新;發送;真 ;

包含的文件具有完整路徑,我只需要文件名。

所以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命令嗎?

假設所有路徑都是http:// <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

10_vilten_tas_2b_2.jpg

這將在很大程度上取決於您的shell及其可用來read分隔符';' 在這種情況下。 如果您有BASH或一些類似的shell,那么解決方案對於除去子字符串很簡單:

#!/bin/bash

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

如果您限於POSIX shell,那么該解決方案將花費更多的工作,並且在隔離URL后,您將繼續使用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解決方案的性能。 要根據長度解析網址,可以使用類似於以下內容的方法:

#!/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文件的盡可能短的URL到達的(例如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

嘗試這樣的事情:

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 ...作了一些假設。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM