[英]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.