Regex 使用正则表达式工具比较删除两个文件中的空格后的字段
我是awk新手,需要找到语句来比较下面文件中的两个字段 这些柱子是分开的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
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