我有一个大文件计数基因型输入文件。这是前几行:
LocusID f nAlleles x y
2L:8347 1 2 44.3166 -12.2373
2L:8347 1 2 39.2667 -6.8333
2L:31184 1 2 39.2667 -6.8333
2L:31184 1 2 39.2667 -6.8333
2L:42788 1 2 39.2667 -6.8333
2L:42788 1 2 39.2667 -6.8333
2L:42887 1 2 39.2667 -6.8333
2L:42887 1 2 39.2667 -6.8333
第一列是基因座 ID,对于每个基因座,我有两行具有相同的基因座 ID。我只想保留那些 x 列和 y 列对于每个基因座不合格的那些。
这是上面示例中我想要的输出
out
2L:8347 1 2 44.3166 -12.2373
2L:8347 1 2 39.2667 -6.8333
知道我该怎么做吗?
经测试。如果文件中确实不存在列标题,请删除 BEGIN 行。
应该是对 Ed Morton 的评论,但太大并且可能更普遍。
在看到两条无益的评论后,我为一个无法开始的 OP 写了一个简单的五分钟作业。您的参考资料给我留下了深刻的印象,其中包含会引起呕吐的替代方法,例如:
我确实指出了更好的技术是可能的,并且我发布并测试了代码。
当然 getline 在这里不是必需的,但它确实为操作提供了一定的对称性。如果您依赖 awk 循环,您最终会使用 FNR % 2 == 1 之类的东西来处理严格交替的行。这很糟糕,因此为了一般性,我宁愿忽略 OP“两行”并按 LocusID 分组行。
我通过将 awk 脚本发布在 shell 变量中来提高它们的尊严,因为它们读起来更好。我讨厌放在命令行上并在奇怪的地方折叠的大型 awk 代码。此外,这确实会破坏 SysAdmins,因为整个 awk 显示在 ps -ef 中并弄乱了输出(在 SunOS 上,它曾经使 ps 崩溃,因为它具有固定的最大行长度)。
我在 bash 中防止这种情况的惯用语是:
其中 ps 列为 awk -f /dev/fd/63,方便地隐藏我的专有代码以防止好奇。
我从不将 shell 命令从 awk 中分离出来:我从不使用 .awk 文件。两种坏事之一将会发生:
(a) 您提供 .awk 文件,并期望用户键入 awk 命令(可能包括“-F|”或其他选项),但他会弄错。
(b) 您为用户提供了 .sh 和 .awk,但存在更新问题,最终导致文件不一致。
出于同样的原因,如果我需要提供手册页,我会将其嵌入到脚本本身中,作为名为 Usage 和 Help 的函数,其中包含 Here 文档。
我很清楚 ''' ... ''' 是没有必要的。但是,我厌倦了发布单引号解决方案并让人们认为“那里缺少报价,我会修复它”,搞砸了我测试过的帖子,然后抱怨它没有用。用几个空字符串混淆它可以阻止人们弄乱它,并增加可见性。
在 Unix 工作了 40 年后,我知道 shell 和 awk 中的保留变量。我有很好的命名规则,但对于一个微不足道的问题,我更喜欢使用 OP 可能直觉的术语。两行,两个向量。我对许多 shell 变量使用大写字母以提高可见性,以将它们与关键字区分开来。任何人都可以写关键字:几乎所有的错误都是因为编码人员看不到数据,他们没有强调变量的作用。
Getline 不会以意想不到的方式失败,因为我知道会发生什么。你可能不喜欢我使用的成语,但这并不会使它们出错。它们是我多年来看到的问题的解决方案。
我的建议:把空格变成逗号,这样你就有了 CSV,然后将其加载到数据库中。
使用
psql
Postgres 和您提供的文件如下temp.csv
所示: