【问题标题】:delete first and last hyphen character from each column从每列中删除第一个和最后一个连字符
【发布时间】:2018-07-11 19:51:21
【问题描述】:

我试图在将它们保存到文件之前从两个单独的列中删除第一个和最后一个字符。我需要删除的字符是连字符。由于结果中的连字符,我无法删除所有这些。有没有更有效的方法来为此使用 awk?

我目前的想法类似于这个命令。

cat file.txt | awk -F '|' '{print $2, $4}' | sed 's/.//;s/.$//' > newfile.txt

文件示例

1-|-40939-23-|-column-3-|-column-4-|
2-|-9832651-23-|-column-3-|-column-4-|

电流输出

40939-23- -column-4  
9832651-23- -column-4

想要的输出

40939-23 column-4 
9832651-23 column-4

【问题讨论】:

  • 试试awk -F'|' '{gsub(/^-|-$/,"", $2);gsub(/^-|-$/,"", $4);print $2 " " $4;}' newfile.txt > tmp && mv tmp newfile.txt
  • 感谢 Wiktor,该解决方案完美运行。

标签: unix awk sed


【解决方案1】:
$ awk -F'-[|](-|$)' '{print $2, $4}' file
40939-23 column-4
9832651-23 column-4

【讨论】:

  • 太棒了,我没有意识到命令可以简化为这个,完美无缺。谢谢埃德莫顿。
  • 还有-F'-\\|-?'
  • wrt \\| vs [|] - 每当您需要 2 个反斜杠时,我更喜欢使用括号表达式,因为它的字符数相同,但恕我直言更清楚一点。 wrt -? vs (-|$) - OP表明你可以在一行的末尾有-|,在这种情况下它必须被视为分隔符,但他没有说-|是否可以出现在一行的中间,如果是的话,是否应该在该上下文中将其视为分隔符,所以我更喜欢后者,因为我知道它将按预期运行。
【解决方案2】:

您能否尝试关注并告诉我这是否有帮助。

awk -F"|" '{gsub(/^-|-$/,"",$2);gsub(/^-|-$/,"",$(NF-1));print $2,$(NF-1)}' Input_file

解决方案 2:考虑到您的 Input_file 将始终相同,因此使用字段编号。

awk 'BEGIN{FS="[-|]";OFS="-"}{print $4 OFS $5 " " $12 OFS $13}' Input_file

【讨论】:

  • 感谢这个 RavinderSingh,我想我可以看到你在这段代码中做了什么,但我可以为我工作。
猜你喜欢
  • 2011-04-11
  • 1970-01-01
  • 2013-12-12
  • 2022-01-17
  • 2014-07-13
  • 1970-01-01
  • 2019-03-20
  • 2016-12-12
相关资源
最近更新 更多