【问题标题】:Use a word as a delimiter for cut command in linux without using awk在不使用awk的情况下,在linux中使用单词作为cut命令的分隔符
【发布时间】:2020-09-27 20:05:39
【问题描述】:

我试图在由某个字符串分隔的文件中获取行的第二段,它通常会像awk -F ':: My Delimiter ::' '{print $2}' 这样工作,但如果我尝试打印$2,它将打印第二个参数传递给awk 命令所在的函数。有没有另一种方法可以用分隔符分割一行并打印结果的某个部分?

这正是我遇到问题的那一行:

for transaction in $(cat $1)
do
    echo "$transaction" | awk -F ':: My Delimiter ::' '{print $2}' >> testLog.data.out
done

注意:分隔符与描述的完全一样。 :: 我的分隔符 ::

【问题讨论】:

  • 你能用一些可以重现问题的示例数据来展示你的代码吗?
  • f I try to print $2 it will print the second argument passed onto the function in which the awk command is located 你是'{print $2}' 还是"{print $2}"
  • 听起来你的代码中有一个你调用 awk 的错误。创建并发布一个minimal reproducible example,显示可以重现问题的完整(但最少)代码以及简洁、可测试的示例输入和预期输出,以便我们开始尝试帮助您调试它。

标签: awk cut


【解决方案1】:

我认为您应该真正使用 awk 而不是使用 cut - 您的示例 awk -F ':: My Delimiter ::' '{print $2}' 应该可以工作。如果您打印了传递给包含该 awk 的函数的第二个参数,那么这意味着 $2 不在单引号内 - 也许您使用了双引号?这不起作用(注意双引号):

awk -F ':: My Delimiter ::' "{print $2}"

但这会(你的例子):

awk -F ':: My Delimiter ::' '{print $2}'

【讨论】:

  • 我用给我带来麻烦的代码行更新了帖子。由于某种原因,即使使用单引号,它仍然无法正常工作。
  • 这条评论让我查看了输入本身,猫似乎有问题。我是逐字阅读,而不是逐行阅读。
【解决方案2】:

您可以使用此代码:

echo ':: My Delimiter ::' | awk '{split($0,v,"My Delimiter"); print v[2]}' 


>>> echo 'ThisIsINeed0 My Delimiter ThisIsINeed1' | awk '{split($0,v," My Delimiter "); print v[1]}'
ThisIsINeed0
>>> echo 'ThisIsINeed0 My Delimiter ThisIsINeed1' | awk '{split($0,v," My Delimiter "); print v[2]}' 
ThisIsINeed1


>>> echo 'This Is I Need 0 My Delimiter This Is I Need 1' | awk '{split($0,v," My Delimiter "); print v[2]}' 
This Is I Need 1
>>> echo 'This Is I Need 0 My Delimiter This Is I Need 1' | awk '{split($0,v," My Delimiter "); print v[1]}' 
This Is I Need 0

【讨论】:

  • 不起作用,它返回一个空格。如果我将其更改为 'v[1]' 它会回显未格式化的字符串,就像忽略 awk
  • 为分隔符添加空格?!?!可能会得到结果。
猜你喜欢
  • 2012-12-28
  • 2010-10-23
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2011-11-26
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多