Awk 在一行上匹配两个图案,并在两列中打印它们

Awk 在一行上匹配两个图案,并在两列中打印它们,awk,filter,grep,Awk,Filter,Grep,我有大约几百个CSV文件。这些CSV文件有不同的定义,我不想手动将所有CSV文件合并成一种格式 我想从文件中得到两个不同的东西-A和B,我可以用正则表达式匹配它们。我想同时匹配这两个元素,这样只会打印同时包含这两个元素的行。我知道如何做到这一点,我也看到过很多回复如何做到这一点的帖子 但是我不知道如何只打印ab,而不打印行的其余部分。我不知道这两件事的顺序或列,所以我不知道如何(或者我是否可以)使用awk 例如: (匹配A[0-9],B[0-9]) 结果: A0 B0 A4 B4 第一种解决方

我有大约几百个CSV文件。这些CSV文件有不同的定义,我不想手动将所有CSV文件合并成一种格式

我想从文件中得到两个不同的东西-A和B,我可以用正则表达式匹配它们。我想同时匹配这两个元素,这样只会打印同时包含这两个元素的行。我知道如何做到这一点,我也看到过很多回复如何做到这一点的帖子

但是我不知道如何只打印
ab
,而不打印行的其余部分。我不知道这两件事的顺序或列,所以我不知道如何(或者我是否可以)使用awk

例如:

(匹配A[0-9],B[0-9])

结果:

A0 B0
A4 B4
第一种解决方案:使用
awk
match
功能。它将根据OP的示例,按字母A到B的顺序给出输出

awk '
match($0,/A[0-9]+/){
  val=substr($0,RSTART,RLENGTH)
  if(val && match($0,/B[0-9]+/)){
     print val,substr($0,RSTART,RLENGTH)
  }
}'  Input_file


第二种解决方案:此解决方案将不考虑字母A和B,因此它们将以相同的顺序出现

awk '
{
  for(i=1;i<=NF;i++){
    if($i ~ /A[0-9]+/ || $i ~ /B[0-9]+/){
       val=val?val OFS $i:$i
    }
  }
  if(val ~ /A[0-9]+/ && val ~ /B[0-9]+/){
    print val
  }
  val=""
}
END{
  if(val ~ /A[0-9]+/ && val ~ /B[0-9]+/){
    print val
  }
}'   Input_file
awk'
{
对于(i=1;i第一种解决方案:使用
awk
match
功能。它将根据OP所示的示例按字母A到B的顺序给出输出

awk '
match($0,/A[0-9]+/){
  val=substr($0,RSTART,RLENGTH)
  if(val && match($0,/B[0-9]+/)){
     print val,substr($0,RSTART,RLENGTH)
  }
}'  Input_file


第二种解决方案:此解决方案将不考虑字母A和B,因此它们将以相同的顺序出现

awk '
{
  for(i=1;i<=NF;i++){
    if($i ~ /A[0-9]+/ || $i ~ /B[0-9]+/){
       val=val?val OFS $i:$i
    }
  }
  if(val ~ /A[0-9]+/ && val ~ /B[0-9]+/){
    print val
  }
  val=""
}
END{
  if(val ~ /A[0-9]+/ && val ~ /B[0-9]+/){
    print val
  }
}'   Input_file
awk'
{
对于(i=1;i
但我不知道如何只打印A B而不打印其他行

那么,您需要从匹配行中删除除A和B之外的所有内容,并强制awk重新计算字段(
$1=$1
这样做)

但我不知道如何只打印A B而不打印其他行

那么,您需要从匹配行中删除除A和B之外的所有内容,并强制awk重新计算字段(
$1=$1
这样做)

awk '/A[0-9]/ && /B[0-9]/ { gsub(/[^AB][0-9]/,""); $1=$1; print }' file