使用bash进行基于列和行的修改

时间:2018-10-03 07:28:56

标签: awk sed

我有一个文件,其中包含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列,进行修改并返回该位置?

1 个答案:

答案 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