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

时间:2018-01-09 08:55:48

标签: linux bash 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

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

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

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

4 个答案:

答案 0 :(得分:4)

Perl解决方案:

private myMethod(): void {
  return this.testService.testMethod()
    .then((response: string) => {
      this.selected = response;
    })
    .catch(error => this.logger.error(error, this));
}
  • perl -pe 's/:/||o||/ for $_, $_' 1.txt 逐行读取输入并在处理后打印每一行
  • -p类似于您可能从sed
  • 中获知的替代 postposition中的
  • s///为以下列表中的每个元素运行上一个命令
  • for保持正在处理的行

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

for ($_) x N

答案 1 :(得分:3)

关注sed也可以帮助您。

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

说明: 简单地用||o||替换第一次出现的冒号,然后第二次出现冒号现在变为第一次出现冒号并用{替换该冒号{1}}根据OP的要求。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

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

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