【问题标题】:While Read and AWK to Change FieldWhile Read 和 AWK 更改字段
【发布时间】:2017-09-01 03:41:27
【问题描述】:

我有两个文件 - FileA 和 FileB。 FileA 有 10 个字段,100 行。如果 Field1 和 Field2 匹配,则应更改 Field3。 FileB 有 3 个字段。我正在使用 while 循环读取 FileB 以匹配两个字段并获取应用于字段 3 的值。

while IFS=$'\t' read hostname interface metric; do
 awk -v var1=${hostname} -v var2=${interface} -v var3=${metric}  '{if ($1 ~ var1 && $2 ~ var2) $3=var3; print $0}' OFS="\t" FileA.txt
done < FileB.txt

在每行迭代中,这会打印 FileB.txt 以及更改的单行。我只希望它打印已更改的行。

请帮忙!

【问题讨论】:

标签: awk while-loop


【解决方案1】:

为文件 B 的每一行调用一次 awk 是一种味道。您应该能够通过每个文件一次完成此任务。

试试这样的:

awk -F'\t' -v OFS='\t' '
    # first, read in data from file B
    NR == FNR { values[$1 FS $2] = $3; next }

    # then, output modified lines from matching lines in file A
    ($1 FS $2) in values { $3 = values[$1 FS $2]; print }
' fileB fileA

我假设您实际上想要匹配字符串相等而不是 ~ 模式匹配。

【讨论】:

  • 格伦,这很有效,而且似乎更有效率。您能告诉我如何打印匹配的行和不匹配的行吗?
  • like this: ($1 FS $2) in values { $3 = values[$1 FS $2] } {print} -- 将 print 语句无条件地放入自己的块中意味着每一行都被打印出来。
【解决方案2】:

我只希望它打印更改的行。

只需将您的print $0 语句放入if 子句主体:

'{if ($1 ~ var1 && $2 ~ var2) { $3=var3; print $0 }}'

甚至更短:

'$1~var1 && $2~var2{ $3=var3; print $0 }'

【讨论】:

  • @user3746195,更短的'$1~var1 &amp;&amp; $2~var2{ $3=var3 }1'
猜你喜欢
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 2020-11-24
相关资源
最近更新 更多