【问题标题】:AWK - OFS is not working with FS character setAWK - OFS 不适用于 FS 字符集
【发布时间】:2019-04-27 23:21:39
【问题描述】:

是否有任何使用 awk 的人至少会因 OFS 失败一次的咒语?

我有以下文件:

someone.txt

LN_A,FN_A<aa@xyz.com>;
LN_B,FN_B<bb@xyz.com>;

而且,我需要:

FN_A,LN_A,aa
FN_B,LN_B,bb   

最初,我尝试了以下输出:

awk -F'[,<@]' -v OFS=',' '{print $2 $1 $3}' someone.txt

FN_ALN_Aaa
FN_BLN_Bbb

在做了一些研究后,我发现有时需要重建记录。所以,我尝试了以下方法,假设更改 NF 将重建记录。

awk -F'[,<@]' -v OFS=',' 'NF=3 {print $2 $1 $3}' someone.txt

FN_ALN_Aaa
FN_BLN_Bbb

然后,我尝试了这个:

awk -F'[,<@]' -v OFS=',' 'NF=3; {print $2 $1 $3}' someone.txt
LN_A,FN_A,aa
FN_ALN_Aaa
LN_B,FN_B,bb
FN_BLN_Bbb

那么,这次重建记录,还是没有运气:

awk -F'[,<@]' -v OFS=',' '{$1=$1} {print $2 $1 $3}' someone.txt

FN_ALN_Aaa
FN_BLN_Bbb

这个成功了,但不像预期的那样:

awk -F'[,<@]' -v OFS=',' '{$1=$1} {print $0}' someone.txt

LN_A,FN_A,aa,xyz.com>;
LN_B,FN_B,bb,xyz.com>;

最后,我做到了以下几点:

awk -F'[,<@]' '{print $2 "," $1 "," $3}' someone.txt

FN_A,LN_A,aa
FN_B,LN_B,bb

PS:

  1. 我知道同一行有很多问题,但我不认为这是重复的,因为它不起作用 - 至少对我来说。 :-)
  2. 我正在使用 GNU awk 3.1.7

【问题讨论】:

  • 使用 perl。 perl -n -e '/(.*),(.*)&lt;(.*)@/;print "$2,$1,$3\n"' &lt; someone.txt
  • 谢谢,成功了!就我而言,我试图理解为什么 OFS 不能在 awk 中工作。不过感谢您的解决方案!欣赏它。
  • 当然我知道这并不能回答您的问题,只是认为另一种方式可能会引起您的兴趣。我碰巧很了解 perl 而不太了解 awk。
  • 不用担心。当然,了解替代选项总是更好。感谢您的解决方案。

标签: awk


【解决方案1】:

OFS 是在print 吃掉一个原始的(未引用的)逗号时生成的

我会这样做:

$ awk -F'[,<@]' -v OFS=, '{print $2,$1,$3}' someone.txt

FN_A,LN_A,aa
FN_B,LN_B,bb

【讨论】:

  • print 在遇到不带引号的逗号时生成OFS 的值(默认为一个空格)。如果这回答了您的问题,请考虑单击复选标记以接受它。
  • 另外,默认情况下,awk 连接空格分隔的对象。所以$2$1$3$2 $1 $3 是等价的。因此,$2, $1, $3 == $2,$1,$3 == $2 , $1 , $3
  • 对。试试{print $2 OFS $1 OFS $3},也是等价的
  • @acs005 好的,既然你已经接受了这个问题的答案,也许你最好用它自己的minimal reproducible example 发布一个新的后续问题。展望未来,请记住,您不需要接受问题的第一个答案 - 等待几个小时才能看到您得到的答案选择是合理的,因为第一个可能不是最适合您的答案,并且即使您可能会从其他人那里获得一些额外的信息/想法,但是一旦您接受答案,它就会阻止大多数人甚至懒得阅读您的问题,更不用说发布另一个答案了。
【解决方案2】:

如果您对sed 没问题,请尝试以下操作(根据您显示的示例编写)。使用sed 将匹配的正则表达式存储在内存中并在替换sed 的部分时使用它的能力,因为sed 基于s/old/new 模式。

sed 's/\([^,]*\),\([^<]*\)<\([^@]*\)\(.*\)/\2,\1,\3/'  Input_file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2013-02-09
    相关资源
    最近更新 更多