繁体   English   中英

在awk中更改一些字段分隔符

[英]Change some field separators in awk

我有一个输入文件1.txt

joshwin_xc8@yahoo.com:1802752:2222:
ihearttofurkey@yahoo.com:1802756:111113
www.rothmany@mail.com:xxmyaduh:13@;:3A

我想要一个输出文件:out.txt

joshwin_xc8@yahoo.com||o||1802752||o||2222:
ihearttofurkey@yahoo.com||o||1802756||o||111113
www.rothmany@mail.com||o||xxmyaduh||o||13@;:3A

我想用'|| o ||'替换1.txt中的前两个':',但是我正在使用的脚本

awk -F: '{print $1,$2,$3}' OFS="||o||" 3.txt

但它没有给出预期的产量。 任何帮助将受到高度赞赏。

Perl解决方案:

perl -pe 's/:/||o||/ for $_, $_' 1.txt
  • -p逐行读取输入并在处理后打印每一行
  • s///类似于你可能从sed知道的替换
  • for in postposition为以下列表中的每个元素运行上一个命令
  • $_保持正在处理的行

对于更高的数字,您可以使用for ($_) x N ,其中N是数字。 例如,要替换前7次出现:

perl -pe 's/:/||o||/ for ($_) x 7' 1.txt

以下sed也可以帮助你。

sed 's/:/||o||/;s/:/||o||/'  Input_file

说明:只需用||o||替换第一次出现的冒号 然后第二次出现结肠现在变成第一次结肠,用||o||代替该结肠 根据OP的要求。

Perl解决方案也,但我认为这个想法可以适用于其他语言:使用split的limit参数:

perl -nE 'print join q(||o||), split q(:), $_, 3' file

(q引用,因为我在Windows上)

假设我们需要替换前2次出现:使用下面的代码

像这样,您可以根据您的要求进行更改,假设您需要更改前7次出现的更改{1..2}更改为{1..7}。

输出将保存在原始文件中。 它不会显示输出

 for i in {1..2}
> do
> sed -i "s/:/||o||/1" p.txt
> done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM