【问题标题】:Replacing a specific field using awk, sed or any POSIX tool使用 awk、sed 或任何 POSIX 工具替换特定字段
【发布时间】:2016-12-23 03:20:39
【问题描述】:

我有一个巨大的文件1,它的值如下:

a 1
b 2
c 3
d 4
e 5

我还有一个巨大的文件2,它是用冒号分隔的七个字段,如下所示:

a:2543:2524:2542:252:536365:54654
c:5454:5454:654:54:87:54
d:87:65:1:98:32:87

我想在行中搜索 file1 的变量并将其值替换为 file2 的第 7 列,因此输出应如下所示:

a:2543:2524:2542:252:536365:1
c:5454:5454:654:54:87:3
d:87:65:1:98:32:4

【问题讨论】:

  • 你试过什么代码/脚本? file1 真的像看起来那么简单吗?您不希望我们为您编写代码,是吗?
  • 用什么替换? file1 是从a1 等的映射吗,如果是,为什么546541 取代?
  • 啊,我明白了-根据file2的第一列?

标签: bash awk sed grep tr


【解决方案1】:

这应该可以工作 - 它假设两个文件都在第一列排序 - 我会对与您的解决方案对非常大文件的性能比较非常感兴趣 - 速度和内存 - --complement 是特定于 linux 的,但很容易如果不可用则替换

file0=$1 #file with single value
file1=$2 #file with 6th value to be replaced
# normalize on colon delimiter
tr ' ' : <$file0|
# join on first field
join -t: $file1 -|
# delete column 7
cut --complement -d: -f7

【讨论】:

  • 我会考虑引用你的扩展——你可以考虑使用&lt;(sort "$file1")&lt; &lt;(sort "$file0") 来保证排序约束。
【解决方案2】:

所以我想出了一个解决方案;最终得到了几行代码。也许有更好的方法。但这有效!

while read line ; do 
  var1=`echo $line| awk '{print $1}'`
  var2=`echo $line| awk '{print $2}'`
  awk -v var1="$var1" -v var2="$var2" -F ':' 'BEGIN { OFS = ":"} $1==var1 {sub(".*",var2,$7)}{print}' file2 > file2.tmp
  mv file2.tmp file2
done < file1
cat file2

【讨论】:

  • read -r var1 var2 _ 替换read line 效率更高。 (当然,最好只有一个awk 完成所有工作,而不是每行一个调用,但这是一个单独的问题)。
【解决方案3】:

也许这个awk 会工作,假设文件是​​发布的

awk -F: 'NR==FNR{a[$1]=$0;next;}a[$1]{$0=a[$1]}1' file1 file2
a:2543:2524:2542:252:536365:1
c:5454:5454:654:54:87:3
d:87:65:1:98:32:4

【讨论】:

  • 不幸的是,这对我不起作用,但我想出了一个解决方案,我在下面发布了。
猜你喜欢
  • 2020-12-09
  • 2021-01-30
  • 2015-04-26
  • 1970-01-01
  • 2011-12-21
  • 2010-10-27
  • 2013-05-30
  • 2017-11-11
  • 2017-02-08
相关资源
最近更新 更多