我有一个文件,其中包含1,000,000行,如下面的“输入”所示。 我想修剪第三列,其中包含从域,URL,URN,URI到仅域名。 我想用bash在Debian上做。
输入:
k285N2YBqOyRFMJBdrP0,10,someurl.ds / dsadsa / dsadsads.exe /,这很糟糕 url_feed k285N2YBqOyRFMJBdrP1,10,http://www.someurl.ds:2331,This是 url_feed错误 k285N2YBqOyRFMJBdrP2,10,https://someurl.ds/dsadsa/dsadsads.exe/,This url_feed错误 k285N2YBqOyRFMJBdrP3,10,someurl.ds / dsadsa / http / test / com,这很糟糕 url_feed k285N2YBqOyRFMJBdrP4,10,a.b.c.some.url / dsadsa / dsadsads.exe /,此 url_feed错误 k285N2YBqOyRFMJBdrP5,10,anythingelse.someurl.ds / dsadsa / dsadsads.exe /,此 url_feed错误
输出:
k285N2YBqOyRFMJBdrP0,10,someurl.ds,这是错误的url_feed k285N2YBqOyRFMJBdrP1,10,www.someurl.ds,这是错误的url_feed k285N2YBqOyRFMJBdrP2,10,someurl.ds,这是错误的url_feed k285N2YBqOyRFMJBdrP3,10,someurl.ds,这是错误的url_feed k285N2YBqOyRFMJBdrP4,10,a.b.c.d.someurl.ds,这是错误的url_feed k285N2YBqOyRFMJBdrP5,10,anythingelse.someurl.ds,这是错误的url_feed
我根据需要减少了第三列:
cat test3.txt | cut -d"," -f3 | sed -E -e 's_.*://([^/@]*@)?([^/:]+).*_\2_' | cut -d "/" -f1
如何提取第3列,进行修改并返回该位置?
答案 0 :(得分:3)
您可以使用以下awk
:
awk 'BEGIN { OFS=FS="," } { sub(/.*:\/\/([^\/@]*@)?/, "", $3); sub(/[\/:].*/, "", $3); print; }' file > outfile
在这里
BEGIN { OFS=FS="," }
会将字段分隔符设置为,
sub(/.*:\/\/([^\/@]*@)?/, "", $3)
将从一开始就删除第3列值中不需要的部分sub(/[\/:].*/, "", $3)
将删除不需要的第3列值的尾部请注意,您可以在print
之后使用1
来代替}
命令(这是同一件事,它将显示当前记录):'BEGIN { OFS=FS="," } { sub(/.*:\/\/([^\/@]*@)?/, "", $3); sub(/[\/:].*/, "", $3); }1'
请参见an online demo。