【问题标题】:compare fields after removing spaces in two files with Regex tools使用正则表达式工具删除两个文件中的空格后比较字段
【发布时间】:2013-06-26 06:12:17
【问题描述】:

我是 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

请告诉我如何修改上述语句以修剪前导和滞后空间,然后进行比较。感谢您的帮助。

【问题讨论】:

  • 什么不起作用?你得到的输出是什么,你想要的输出是什么?
  • 我需要从 1.tsv 和 2.tsv 中删除空间,然后进行比较,以便两个文件的 $1 完美匹配

标签: regex perl sed awk pattern-matching


【解决方案1】:

这样做:

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

【讨论】:

  • 1 ,a 2,b 3 ,c 是我得到的结果。如果我们忽略前导空格和尾随空格,则两个文件中的第 1 列匹配
  • 那你的预期结果是什么?我没有得到任何显示您的文件匹配的输出。
【解决方案2】:

在尝试将其定位到数组 a 中之前,您需要删除 $1 中的所有空格:

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

【讨论】:

  • 我得到的结果是 1space,a 和 2,b
【解决方案3】:
awk -F, '
{ key=$1; gsub(/^[[:space:]]+|[[:space:]]+$/,"",key) }
NR==FNR { a[key]; next }
!(key in a)
' 2.tsv 1.tsv

【讨论】:

  • +1 不错的解决方案。就像您为两个文件制作gsub 一样。较小的更正,gsub 语法缺失),我相信 OP 想要!(key in a),但我想这对他来说是微不足道的。 :)
  • 已修复,感谢您的更正。此外,请注意,通过在变量 ad 中保存 $1 然后修改 THAT,它会按原样保留文件以供输出,并避免使用 OFS 重新编译记录,因此无需设置或担心后果(更多是其他 FS 设置的问题)。
  • 如果我想比较多个字段,有没有比以下更好的方法:nawk -F, '{ key1=$1; gsub(/^ *| *$/,"",key1) ;key2=$2; gsub(/^ *| *$/,"",key2) }NR==FNR { a[key1,key2]; next }!((key1,key2) in a)' 2.tsv 1.tsv
  • @Awknewbie:可以说是awk -F, '{key=$1 FS $2; gsub(/(^|,) *| *($|,)/,"",key)} NR==FNR { a[key]; next }!(key in a)' 2.tsv 1.tsv。您可以在 RE 中使用 FS 而不是显式的 ,,方法是用双引号而不是斜杠将其括起来并跳出 FS 周围的引号:awk -F, '{key=$1 FS $2; gsub("(^|"FS") *| *($|"FS")","",key)} NR==FNR { a[key]; next }!(key in a)' 2.tsv 1.tsv 因此,如果 FS 发生变化,它会更加健壮,但它会变成有点难读,你可能需要转义一些字符(如果你在乎的话,测试一下)。
【解决方案4】:

GNU 代码

sed -r 's#\s*(\S+)\s*,\s*(\S+)\s*#/\\s*\1\\s*,\\s*\2\\s*/p#' file1|sed -f - file2
$猫文件1 1、一 2,b 3,c $猫文件2 1、一 2,b 3,c $sed -r 's#\s*(\S+)\s*,\s*(\S+)\s*#/\\s*\1\\s*,\\s*\2\\s */d#' 文件1|sed -nf - 文件2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    相关资源
    最近更新 更多