我有一个csv文件,包括以下几行: 8;;
格罗特·施图德塔斯会见了“Twee Hanen”的gekleurde borduursel
De tas是吉阿克·范恩斯蒂夫·维尔特遇见了4毫米瓦尔特面包车
我们遇到了一些问题
范德塔斯是范斯塔夫
宾尼宁甚至还见过他。
Ook是de telefoon
De tas是ruim en praktisch
AFMETINGEN:
面罩: 46厘米(verstelbaar 7厘米)
Hoogte: 34厘米
het midden的Breedte : 42厘米
Bodemmaat: 30 x 10厘米
Schouderriem长55 cm tot 130 cm
Gebruikte materialen: vilt en kunstleer
Productiemethode: handwerk
在kleur 1.jpg;;;;;;;Fixed;New;Send;True,Vilten遇到了twee hanen;
包含的文件都有完整的路径,我只想要文件名。
于是2.jpg;变成了10_vilten_tas_2b_2.jpg;
正如您所看到的,路径的结构并不总是相同的。我可以使用某种linux命令吗?
发布于 2015-07-17 11:14:53
假设您的所有路径都是http://`/`,那么
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发布于 2015-07-17 08:39:09
这在很大程度上将取决于您的shell以及它可以用于read的工具,在本例中是分隔符';'。如果您有BASH或一些类似的shell,那么使用子字符串删除解决方案就很简单了。
#!/bin/bash
while read -d ';' -r line; do
((${#line} >= 12)) && [[ $line =~ http ]] &&
printf "%s\n" ${line##*/}
done < "$1"如果您仅限于POSIX,那么解决方案需要更多的工作,并且一旦sed被隔离,您将继续解析它。将每个URL从包含多个URL的用分号分隔的行中分离是有点棘手的。在POSIX中,您基本上必须在每一行中输入蠕虫,一次读取一个字符(大型文件的读取速度很慢),下面将验证每一行在开始时都包含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 )的最短URL计算出来的。
在所有情况下,您给出的示例文件的结果都是相同的:
输入
$ 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发布于 2015-07-17 09:11:35
试着做这样的事情:
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}' | xargshttps://stackoverflow.com/questions/31471534
复制相似问题