[英]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
包含的文件具有完整路徑,我只需要文件名。
所以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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.