Awk 如何使用sed命令获取特定字符串

Awk 如何使用sed命令获取特定字符串,awk,sed,grep,Awk,Sed,Grep,我有一个如下所示的输入字符串: VAL:1|b:2|c:3|VAL:<har:919876543210@abc.com>; tag=vy6r5BpcvQ|VAl:1234|name:mnp|VAL:91987654321 我想要这样 1,har:919876543210@abc.com 我在哪里犯了错误?我该如何解决它?编辑:根据OP对输入文件的更改和OP的评论,现在添加以下内容 awk ' BEGIN{ FS="|"; OFS=","

我有一个如下所示的输入字符串:

   VAL:1|b:2|c:3|VAL:<har:919876543210@abc.com>; tag=vy6r5BpcvQ|VAl:1234|name:mnp|VAL:91987654321
我想要这样

1,har:919876543210@abc.com
我在哪里犯了错误?我该如何解决它?

编辑:根据OP对输入文件的更改和OP的评论,现在添加以下内容

awk '
BEGIN{ FS="|"; OFS="," }
{
  sub(/[^:]*:/,"",$1)
  gsub(/^[^<]*|; .*/,"",$4)
  gsub(/^<|>$/,"",$4)
  print $1,$4
}'  Input_file
说明:增加对以上内容的详细说明

awk '                                ##Starting awk program from here.
BEGIN{                               ##Starting BEGIN section of this program from here.
  FS="|"                             ##Setting FS as pipe here.
  OFS=","                            ##Setting OFS as comma here.
}
{
  val=""                             ##Nullify val here(to avoid conflicts of its value later).
  for(i=1;i<=NF;i++){                ##Traversing through all fields here
    split($i,arr,":")                ##Splitting current field into arr with delimiter by :
    if(arr[1]=="a" || arr[1]=="d"){  ##Checking condition if first element of arr is either a OR d
      gsub(/^[^:]*:|; .*/,"",$i)     ##Globally substituting from starting till 1st occurrence of colon OR from semi colon to everything with NULL in $i.
      val=(val?val OFS:"")$i         ##Creating variable val which has current field value and keep adding in it.
    }
  }
  print val                          ##printing val here.
}
' Input_file                         ##Mentioning Input_file name here. 
编辑:根据OP对输入文件的更改和OP的评论,现在添加以下内容

awk '
BEGIN{ FS="|"; OFS="," }
{
  sub(/[^:]*:/,"",$1)
  gsub(/^[^<]*|; .*/,"",$4)
  gsub(/^<|>$/,"",$4)
  print $1,$4
}'  Input_file
说明:增加对以上内容的详细说明

awk '                                ##Starting awk program from here.
BEGIN{                               ##Starting BEGIN section of this program from here.
  FS="|"                             ##Setting FS as pipe here.
  OFS=","                            ##Setting OFS as comma here.
}
{
  val=""                             ##Nullify val here(to avoid conflicts of its value later).
  for(i=1;i<=NF;i++){                ##Traversing through all fields here
    split($i,arr,":")                ##Splitting current field into arr with delimiter by :
    if(arr[1]=="a" || arr[1]=="d"){  ##Checking condition if first element of arr is either a OR d
      gsub(/^[^:]*:|; .*/,"",$i)     ##Globally substituting from starting till 1st occurrence of colon OR from semi colon to everything with NULL in $i.
      val=(val?val OFS:"")$i         ##Creating variable val which has current field value and keep adding in it.
    }
  }
  print val                          ##printing val here.
}
' Input_file                         ##Mentioning Input_file name here. 
您也可以尝试以下脚本:

cat文件 瓦尔:1 | b:2 | c:3 |瓦尔:;tag=vy6r5BpcvQ | VAl:1234 | name:mnp | VAl:91987654321 awk-F'[|]''{ = 对于i=1;i您也可以尝试以下脚本:

cat文件 VAL:1 | b:2 | c:3 | VAL:;tag=vy6r5BpcvQ | VAL:1234 | name:mnp | VAL:91987654321 awk-F'[|]''{ =
对于i=1;i您可以使用扩展正则表达式、两个捕获组和两个反向引用(例如

sed-E的/^[^:::*:\w+[^',和 .*$丢弃行中所有剩余的字符,然后进行替换 \1、\2重新插入用逗号分隔的捕获组。 示例使用/输出

$echo'a:1 | b:2 | c:3 | d:;tag=vy6r5BpcvQ |'
sed-E的/^[^:::*:\w+[^使用扩展正则表达式、两个捕获组和两个反向引用,您可以非常轻松地使用sed完成同样的事情,例如

sed-E的/^[^:::*:\w+[^',和 .*$丢弃行中所有剩余的字符,然后进行替换 \1、\2重新插入用逗号分隔的捕获组。 示例使用/输出

$echo'a:1 | b:2 | c:3 | d:;tag=vy6r5BpcvQ |'
sed-E的/^[^:::*:\w+[^如果您仍在使用Awk,请在Awk中执行所有处理。有时我可能会收到与val:相同的字段名中的值,而不是a和d,那么我如何获取其值如果您仍在使用Awk,请在Awk中执行所有处理。有时我可能会收到与val:相同的字段名中的值,而不是a和d,那么我如何获取其valuesHi先生,谢谢你的回答,它对这个案例有效,我有一个疑问,如果不是A和D,而是在同一个字段名中,就像两个值都出现在D:1 | D:;tag=vy6r5BpcvQ中一样,那么我必须修改什么,因为文件可能包含巨大的data@mark,对不起,这不清楚,请给出更清楚的例子。好的,如果情况是这样的输入:-a:1 | b:2 | c:3 | a:;tag=vy6r5BpcvQ |如果第一个和第四个入口的键都是“a”,那么很好的注释答案。是的,它起作用了,我对gsub做了一些小的更改/^[^您好,先生,谢谢您的回答,它适用于这个案例,我有一个疑问,如果我没有使用A和D,而是使用了相同的字段名,就像这两个值都出现在D:1 | D:;tag=vy6r5BpcvQ中一样,那么我必须更改什么,因为文件可能包含巨大的data@mark,抱歉,这不清楚,请给出更清楚的例子。好的,如果案例是这样的输入:-a:1 | b:2 | c:3 | a:;tag=vy6r5BpcvQ |如果第一个和第四个入口的键都是“a”,那么很好的注释答案。是的,它起作用了,我对gsub做了一些小的更改/^[^您好,先生,感谢您的解决方案,在这里访问a和d字段并进行筛选,我有一个疑问,如果不是两个不同的字段a和d,而是输入更改为a:1 | b:2 | c:3 | a:;tag=vy6r5BpcvQ,那么如何筛选它,因为可能有多个字段的名称以相同的字段开头,如d@mark我有一个疑问…-什么你有一个问题,不是怀疑。怀疑意味着你不相信别人告诉你的事情,一个问题只是意味着你想了解一些事情的信息。这是印度英语口语中的一个常见错误,请看。当然没什么大不了的,只是想知道。嗨,先生,谢谢你的解决方案,在这里访问a和d字段,然后开始过滤,我有一个疑问,如果不是2个不同的字段a和d,而是输入更改为a:1 | b:2 | c:3 | a:;tag=vy6r5BpcvQ,那么如何过滤它,因为可能有多个字段的名称以相同的字段开头,如d@mark我有一个疑问…-你有一个问题,不是疑问。疑问意味着你不相信某事ng有人告诉你,一个问题只是意味着你想了解一些事情的信息。这是印度英语中的一个常见错误,你看。当然没什么大不了的,只是想知道而已。