Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用正则表达式工具比较删除两个文件中的空格后的字段_Regex_Perl_Sed_Awk_Pattern Matching - Fatal编程技术网

Regex 使用正则表达式工具比较删除两个文件中的空格后的字段

Regex 使用正则表达式工具比较删除两个文件中的空格后的字段,regex,perl,sed,awk,pattern-matching,Regex,Perl,Sed,Awk,Pattern Matching,我是awk新手,需要找到语句来比较下面文件中的两个字段 这些柱子是分开的 1.csv _________ 1space, aspace 2,b space3space,c 2.csv ____________ 1space,spacea space2,bspace 3,spacecspace 如果在1.tsv或2.tsv字段中没有引导或培训空间,则以下语句可以正常工作 nawk -F, 'NR==FNR{a[$1,$2]++;next} !(a[$1,$2])' 2.tsv

我是awk新手,需要找到语句来比较下面文件中的两个字段 这些柱子是分开的

1.csv
_________
1space, aspace

2,b

space3space,c

2.csv
____________
1space,spacea   

space2,bspace
3,spacecspace

如果在1.tsv或2.tsv字段中没有引导或培训空间,则以下语句可以正常工作

nawk -F, 'NR==FNR{a[$1,$2]++;next} !(a[$1,$2])'  2.tsv 1.tsv
请让我知道我们如何修改上述声明,以修剪前导和滞后空间,然后进行比较。感谢您的帮助。

请执行以下操作:

awk '
BEGIN {FS=OFS=","}
NR==FNR {
    gsub(/^ *| *$/,"",$1)
    a[$1]++
    next
}
{
    gsub(/^ *| *$/,"",$1); 
    if (!($1 in a)) {
        print
    }
}' 2.tsv 1.tsv

在尝试在数组
a
中定位它之前,需要修剪
$1
中的所有空格:

awk -F"," 'NR==FNR{$1=$1;a[$1]++;next} {f1=$1; gsub(/ /, "", f1); 
           if (!a[f1]) print}'  2.tsv 1.tsv
GNU代码:

$cat文件1 1、a 2,b 3,c $cat文件2 1、a 2,b 3,c $sed-r的s#\s*(\s+)\s*,\s*(\s+)\s*#/\\s*\1\\s*,\\s*\2\\s*/d#'文件1 | sed-nf-文件2
什么不起作用?您得到的输出是什么?您想要的输出是什么?我需要从1.tsv和2.tsv中删除空间,然后进行比较,以便两个文件的$1完全匹配。我得到的结果是1空间,a和2,b1,a 2,b 3,c是我得到的结果。如果忽略前导空格和尾随空格,两个文件中的第1列都匹配,那么您的预期结果是什么?我没有得到任何显示文件匹配的输出。+1很好的解决方案。就像您使两个文件共用
gsub
的方式一样。轻微的更正,
gsub
语法缺失
,我相信OP需要
!(输入a)
,但我想这对他来说是微不足道的修正了,谢谢你的修正。另外,请注意,通过在变量ad中保存$1,然后对其进行修改,它保留了文件的输出状态,避免了使用OFS重新编译记录,因此无需设置该值或担心其后果(其他FS设置存在更多问题)。如果要比较多个字段,是否有比:nawk-F,'{key1=$1;gsub更好的方法(/^*$/,“”,key1);key2=$2;gsub(/^*$/,“”,key2)}NR==FNR{a[key1,key2];next}!((a)中的key1,key2)2.tsv 1。tsv@Awknewbie:可以说是
awk-F,'{key=$1fs$2;gsub(/(^ |,)***($|,)/,'',key)}NR==FNR{a[key];next}!(键入a)'2.tsv 1.tsv
。您可以在RE中使用
FS
,而不是显式的
,方法是将其用双引号括起来,而不是用斜杠,并跳出FS的引号:
awk-F,{key=$1fs$2;gsub($“FS”)**($“FS”),“,”,key)}NR==FNR{a[key];next}!(在a中输入)'2.tsv 1.tsv
因此,如果FS发生变化,它会更健壮,但它会变得更难读取,并且可能需要转义一些字符(如果需要,请测试它)。
awk -F, '
{ key=$1; gsub(/^[[:space:]]+|[[:space:]]+$/,"",key) }
NR==FNR { a[key]; next }
!(key in a)
' 2.tsv 1.tsv
sed -r 's#\s*(\S+)\s*,\s*(\S+)\s*#/\\s*\1\\s*,\\s*\2\\s*/p#' file1|sed -f - file2
$cat file1 1 , a 2,b 3 ,c $cat file2 1 ,a 2,b 3,c $sed -r 's#\s*(\S+)\s*,\s*(\S+)\s*#/\\s*\1\\s*,\\s*\2\\s*/d#' file1|sed -nf - file2