【问题标题】:awk find and replace variable file2 into file1 when matchedawk 在匹配时查找变量 file2 并将其替换为 file1
【发布时间】:2016-10-24 14:21:34
【问题描述】:

尝试了几个类似问题的答案,但没有得到正确的结果。尝试在第二个文件中搜索变量,如果存在则用第二个变量替换,否则保持原始...

文件1.txt

a
2
c
4
e
f

文件2.txt

2 b
4 d

想要的输出.txt

a
b
c
d
e
f

到目前为止,我所拥有的似乎有点工作,但是在发生替换的任何地方,我都会得到一个空白行而不是新变量...... 当前输出.txt

a

c

e
f

当前代码....

awk -F'\t' 'NR==FNR{a[$1]=$2;next} {print (($1 in a) ? a[$1] : $1)}' file2.txt file1.txt > output.txt

也试过了,结果一样...

awk -F'\t' 'NR==FNR{a[$1]=$2;next} {$1 = a[$1]}1' file2.txt file1.txt > output.txt 

抱歉先写错了。。修复了键值问题。

确实尝试过你所做的,但 output.txt 中仍然没有丢失

awk -F'\t' 'NR==FNR{a[$1]=$2;next} $1 in a{$1 = a[$1]}1' file2.txt file1.txt > output.txt

【问题讨论】:

  • 也只是一个评论,这些文件对于 file1 大约有 200 万行,对于 file2 大约有 150 万行。我只想在 file2 中找到匹配项时更改 file1。我检查了输出文件中的行数以确保它是正确的,但当我检查一些我知道应该更改的内容时,我发现它们是空行而不是新变量。所以它似乎是在找到匹配的变量,然后什么都没有替换它。
  • 当前代码缺少右括号。
  • 修复了括号,在我的实际代码中,所以不是导致问题的原因。谢谢。
  • 不,不是。你的数据一定有问题。代码很好。双标签什么的。或者一个制表符和一个空格。

标签: bash awk


【解决方案1】:

您的键值对不对...$1 是键,$2 是值。

$ awk -F'\t' 'NR==FNR{a[$1]=$2;next} $1 in a{$1=a[$1]}1' file.2 file.1
a
b
c
d
e
f

【讨论】:

  • 对不起,我写在这里是为了更简单,并混合了键值。我只是尝试了你写的东西,但仍然给我缺失的值......而且有点困惑
  • '$1 in a{$1=a[$1]}' 和我上面写的不一样?
  • 是的,你写了$1 = a[$2],这也不对。
  • 嗨,对不起。因为我最初混淆了上面的键值,所以我认为你的 {1=a[$1]} 与我的不同,但事实并非如此。我只是改变了那一部分,它可以工作。你能解释一下那部分吗?我以为它是在说使 file1 的第 1 列现在等于 file2 中 a[$2] 的值?
  • 将数组“a”视为查找。您正在查找为密钥存储的值,即 $1。
【解决方案2】:

尝试以下解决方案 -

awk 'NR==FNR{a[$1]=$NF;next} {print (a[$NF]?a[$NF]:$1)}' file2.txt file1.txt

a
b
c
d
e
f

【讨论】:

    猜你喜欢
    • 2016-01-02
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    相关资源
    最近更新 更多