【问题标题】:subtract columns from different files with awk使用 awk 从不同文件中减去列
【发布时间】:2012-08-11 10:13:57
【问题描述】:

我有两个文件夹 A1 和 A2。这两个文件夹中的文件名和文件数相同。每个文件有 15 列。文件夹“A1”中每个文件的第 6 列需要从文件夹“A2”中每个文件的第 6 列中提取。我想将每个文件的第 2 列和第 6 列(减法后)打印到具有相同文件名的文件夹 A3 中。如何使用 awk 做到这一点?

f1.txt file in folder A1

RAM     AA   159.03  113.3  122.9  34.78    116.3 
RAM     BB   151.24   70    122.9  142.78   66.4
RAM     CC   156.70   80    86.2   70.1     54.8


  f1.txt file in folder A2    

RAM     AA   110.05  113    122.9    34.78    116.3
RAM     BB   150.15  70     122.9    140.60   69.4 
RAM     CC   154.70  89.2   86.2     72.1     55.8


desired output

AA   0
BB  2.18
CC  -2

【问题讨论】:

标签: awk


【解决方案1】:

试试这个:

paste {A1,A2}/f1.txt | awk '{print $2,$6-$13}'

bash{A1,A2}/f1.txt 将扩展为A1/f1.txt A2/f1.txt(这只是一个快捷方式。没关系。)
我使用paste 命令垂直合并文件。
awk 命令在这里很简单。

【讨论】:

  • join 是一个 shell 命令(用于 bash)吗? {}指定输入文件集,/指定输出文件?
  • 是的,我在bash(Ubuntu 12.04) 中测试它。
  • 谢谢 - 在我看来,为解决方案提供一些基本解释有助于得到更好、更有用的答案。
  • 这比被选为最佳的答案更简单、更彻底的解释,它甚至不能放在一行上,也没有解释任何事情是如何工作的。我第一次访问这个页面时,这个优雅的解决方案被隐藏了,我没有注意到它。我希望强烈考虑将这个问题移到顶部的可能性。
【解决方案2】:

一种使用awk的方式:

awk 'FNR==NR { array[$1]=$2; next } { if ($1 in array) print $1, array[$1] - $2 > "A3/f1.txt" }' ~/A1/f1.txt ~/A2/f1.txt

第一次编辑:

假设两个目录(A1A2)中的文件数量相同,文件名按照您描述的方式配对:

for i in A1/*; do awk -v FILE=A3/${i/A1\//} 'FNR==NR { array[$1]=$2; next } { if ($1 in array) print $1, array[$1] - $2 > FILE }' A1/${i/A1\//} A2/${i/A1\//}; done

您需要先创建目录A3,否则会出错。

第二次编辑:

awk 'FNR==NR { array[$2]=$6; next } { if ($2 in array) print $2, array[$2] - $6 > "A3/f1.txt" }' ~/A1/f1.txt ~/A2/f1.txt

第三次编辑:

for i in A1/*; do awk -v FILE=A3/${i/A1\//} 'FNR==NR { array[$2]=$6; next } { if ($2 in array) print $2, array[$2] - $6 > FILE }' A1/${i/A1\//} A2/${i/A1\//}; done

【讨论】:

  • 感谢您的回答。我的文件有 15 列。我想在减去 column6 的值后打印 column2 和 column6。我在您的代码中更改了 $2,$6 而不是 $1,$2。减法的结果不正确。如何更改您的代码以获得正确的值?
  • @user1588971:我无法解释您的请求。请考虑使用 15 列文件的示例以及您期望的输出示例来更新您的问题。我对您的要求进行了编辑,但我可能完全误解了这个问题。
  • 感谢您的评论。使用您的第二个编辑代码时出现以下错误。 awk:命令。行:1:致命:无法打开文件“/home/nimi/A1/f1.txt”进行读取(没有这样的文件或目录)。当我对多个文件使用您的第一个编辑代码时,我没有收到任何错误。但是 column6 之间的减法的答案是不正确的。 column2 打印正确。
  • @user1588971:我已经测试了第二个编辑,它对我有用。您收到的错误表明您的输入 A1/f1.txt 无法找到。您可能需要检查此文件(及其对)是否存在。我已更新我的答案以允许多个文件,但脚本本质上是相同的。
  • 非常感谢您的帮助。
猜你喜欢
  • 2013-02-09
  • 2018-07-13
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多