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

Awk 使用bash进行基于列和行的修改,awk,sed,Awk,Sed,我有一个包含1000000行的文件,如下面的“输入”所示。 我想把第三列从域、URL、URN、URI删减到一个域名。 我想用bash在Debian上实现它 输入: k285N2YBqOyRFMJBdrP0,10,someurl.ds/dsadsa/dsadsads.exe/,这是错误的 url_提要k285N2YBqOyRFMJBdrP1,10是 错误的url\u源 k285N2YBqOyRFMJBdrP2,10, 是错误的url\u提要吗 k285N2YBqOyRFMJBdrP3,10,som

我有一个包含1000000行的文件,如下面的“输入”所示。 我想把第三列从域、URL、URN、URI删减到一个域名。 我想用bash在Debian上实现它

输入:

k285N2YBqOyRFMJBdrP0,10,someurl.ds/dsadsa/dsadsads.exe/,这是错误的 url_提要k285N2YBqOyRFMJBdrP1,10是 错误的url\u源 k285N2YBqOyRFMJBdrP2,10, 是错误的url\u提要吗 k285N2YBqOyRFMJBdrP3,10,someurl.ds/dsadsa/http/test/com,这很糟糕 url\u提要 k285N2YBqOyRFMJBdrP4,10,a.b.c.d.someurl.ds/dsadsa/dsadsads.exe/,此 是错误的url\u提要吗 k285N2YBqOyRFMJBdrP5,10,anythingelse.someurl.ds/dsadsa/dsadsads.exe/,此 是错误的url\u提要吗

输出:

k285N2YBqOyRFMJBdrP0,10,someurl.ds,这是错误的url\u提要 k285N2YBqOyRFMJBdrP1,10,www.someurl.ds,这是错误的url\u提要 k285N2YBqOyRFMJBdrP2,10,someurl.ds,这是错误的url\u提要 k285N2YBqOyRFMJBdrP3,10,someurl.ds,这是错误的url\u提要 k285N2YBqOyRFMJBdrP4,10,a.b.c.d.someurl.ds,这是错误的url\u提要 k285N2YBqOyRFMJBdrP5,10,anythingelse.someurl.ds,这是一个错误的url\u提要

我正在减少第3列,因为我想要:

cat test3.txt | cut -d"," -f3 | sed -E -e 's_.*://([^/@]*@)?([^/:]+).*_\2_' | cut -d "/" -f1

如何提取第三列、修改并返回该位置?

您可以使用以下
awk

awk 'BEGIN { OFS=FS="," } { sub(/.*:\/\/([^\/@]*@)?/, "", $3); sub(/[\/:].*/, "", $3); print; }' file > outfile
这里,

  • BEGIN{OFS=FS=“,”}
    将字段分隔符设置为
  • sub(/.*:\/\/([^\/@]*@)/,“,$3)
    将删除列3开头不需要的部分值
  • sub(/[\/:].*/,“”,$3)
    将删除不需要的第3列值的尾部
请注意,您可以在
}
之后使用
1
而不是
print
命令(最后,它将打印当前记录):
'BEGIN{OFS=FS=“,”}{sub(/.*:\/\/([^\/]*@)/,“,$3);sub(/[\/:].*,”“,$3);}1'


请参阅。

使用perl或awk做这件事不是更容易吗?请尝试
awk'BEGIN{OFS=FS=“,”}{sub(/.\/\/\/([^\/]*@)/,”,“,$3);sub(/[\/:].*,”,$3);打印;}文件
非常可靠的解决方案。我的文件被100%正确处理。time awk'BEGIN{OFS=FS=“,”}{sub(/.*:\/\/([^\/@]*@)/,”,“,$3);sub(/[\/:].*/,”,“,$3);print;}'export.csv>1234.txt real 0m0.901s user 0m0.688s sys 0m0.208s wc-l 1234.txt 1013861 1234.txt