【问题标题】:Bash script for awk command用于 awk 命令的 Bash 脚本
【发布时间】:2017-08-11 17:34:18
【问题描述】:

如果您在以下方面提供帮助,我将不胜感激。

我有以下文件(file.txt),大约有 10,000 行:

ID1  ID2  0  1  0.5  0.6
ID3  ID4  0  0  0.4  0.8
ID1  ID5  0  1  0.5  0.3
ID6  ID2  1  0  0.4  0.8

前两列中的 ID 在文件中可能出现 1 到 10 次(在第 1 列或第 2 列中)。

我想要达到的目标:

我想逐行扫描此文件,如果 ID 满足以下条件,则将其打印到不断增长的排除列表中:

我的标准如下:

If $3 > $4, print $2 (ID2) to exclusionlist.txt
If $3 < $4, print $1 (ID1) to exclusionlist.txt
If $3 = $4 and $5 < $6, print $2 (ID2) to exclusionlist.txt
If $3 = $4 and $5 > $6, print $1 (ID1) to exclusionlist.txt

因此,将其应用于第 1 行,ID1 应该在我的排除列表中,因为 $3

然后我想删除文件中出现排除列表中该 ID 的 所有 行。 (最多可以有 10 行)。

扫描第 1 行后,file.txt 的输出应如下所示:

ID3 ID4 0 0 0.4 0.8
ID6 ID2 1 0 0.4 0.8

还有exclusionlist.txt: ID1

然后我想从新的第 1 行重新开始(因为原来的第 1 行将根据定义被删除),并执行相同的过程,但继续将我的排除从新的第 1 行添加到相同的排除列表中。

这是尝试过的。这意味着必须将 file.txt 重命名为 1.txt

#! bin/bash
for i in {1..5000}
do
awk 'NR==1{print;}' $i.txt
awk '{if ($3>$4 || $3==$4 && $5<$6) print $2;}' $i.txt >      exclusionlist_$i.txt
awk '{if ($3>$4 || $3==$4 && $5>$6) print $1;}' $i.txt >>    exclusionlist_$i.txt
grep -v -f exclusionlist_$i.txt $i.txt > $((i+1)).txt
rm $i.txt
done

由于我糟糕的脚本编写技巧,我不得不:(1) 在每次循环后重命名我的文件,以便它能够连续执行,以及 (2) 每次循环都有一个新的排除列表,而不是单个“主”排除列表 - 我可以轻松地将它们全部连接到最后,所以这不是一个主要问题,但很混乱。

我遇到的问题是这个命令似乎扫描了整个文件(而不仅仅是第 1 行),从第一次运行开始就创建了一个长的排除列表。

任何帮助/建议将不胜感激。

谢谢。

GB

【问题讨论】:

标签: bash loops awk


【解决方案1】:

我不明白您为什么需要分多个步骤执行此操作。最终,所有行都将被删除,您只会得到排除列表。

例如,这将在一次传递中执行相同的操作

$ awk '!($1 in exc) && !($2 in exc){f=($3>$4 || $3==$4 && $5<$6)?2:1; 
                                    print $f > "exclusion.list"; exc[$f]}' file

$ cat exclusion.list
ID1
ID4
ID2

由于唯一的结果是排除列表,您可以将其打印到标准输出

$ awk '!($1 in exc) && !($2 in exc){f=($3>$4 || $3==$4 && $5<$6)?2:1; 
                                    print $f; exc[$f]}' file  > exclusion.list          

并重定向到一个文件。

或者,也许我误解了这个问题。另请注意,您的规范中未定义 $3==$4 &amp;&amp; $5==$6 条件。也许这就是你所追求的?!如果是这样,请创建包含此严重案例的示例数据并指出需要发生的事情。

【讨论】:

  • 这似乎工作得很好。真的非常感谢! (注意 $3==$4 && $5==$6 不会出现在文件中)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 2018-08-28
  • 1970-01-01
相关资源
最近更新 更多