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