【发布时间】:2015-08-12 09:02:32
【问题描述】:
我有两个(巨大的~100 GB)文件,多个字段的文本通过它们在行中的固定位置来区分(没有分隔)。
当 File1 中特定位置(例如,位置 16-20)的文本包含小于我选择的某个值(例如,小于 -5)的数值时,我希望更改相应的字段(也在第二个文件中的固定位置给出)到某个预设值(比如 10)。通过对应,我的意思是它们的行号相同(在下面的示例中 - 两者都在各自文件的第 3 行)
例如文件1:
ABC(11 个空格)5.78 3.65 9.22(更重要的东西)
EFG(11 个空格)4.78 9.65 9.99(更重要的东西)
HIJ(11 个空格)-5.78 9.99 9.99(更重要的东西)
文件 2(之前):
LMN(11 个空格)31.21 2.14 1.27(更重要的东西)
OPQ(11 个空格)4.78 9.99 9.99(更重要的东西)
RST(11 个空格)3.29 9.99 9.99(更重要的东西)
文件 2(之后):
LMN(11 个空格)31.21 2.14 1.27(更重要的东西)
OPQ(11 个空格)4.78 9.99 9.99(更重要的东西)
RST(11 个空格)10.00 9.99 9.99(更重要的东西)
对于使用脚本实用程序的某些 Unix 大师来说,这似乎应该是一项非常简单的任务,但我对这些工具还不够熟悉,无法将它们串在一起并解决任务。我只能完成其中的一部分,例如使用“cut”根据位置选择字段。例如,我在下面的 bash 脚本中做到了这一点:
#!/bin/bash
# PURPOSE: Process a file line by line with PIPED while-read loop.
FILENAME=$1
count=0
cat $FILENAME | while read LINE
do
xcoor=$(echo "$LINE" | cut -c 16-20)
let count++
if [ "$xcoor" -lt -4 ]
then
echo "$count"
#I have identified the lines I want in the first file.
#Now I need to modify the second file
fi
done
我的部分问题只是我一次处理 2 个文件这一事实。 最大的问题是前面提到的大量文件 - 这就是为什么我认为逐行执行它很重要 - 避免将整个文件读入内存 - 或不必要地写入临时文件。
非常感谢您提供任何帮助,如果您愿意简要说明命令的组件的作用,那将非常有帮助,因为我想了解命令的作用,以便我可以根据需要修改它们(我是 Unix 脚本的初学者。)
谢谢!
【问题讨论】:
-
better edit 你的问题给出了正确的格式,并显示了你到目前为止所尝试的内容
-
正确格式是什么意思?示例文件具有所需的格式。
-
对于 2 文件问题,请参阅
paste。它将两个文件中的相应行连接在一起,然后您可以像处理单个文件一样处理它们(以流方式,即无需创建临时文件)。 -
谢谢@jas,这很有帮助。我会试试。但是,我还需要修改第二个文件。对此有何建议?
-
是的,将 paste 的输出通过管道传输到 awk(例如)。如果 File1 中的行部分符合您的条件,则输出 File2 中行的(修改后的)部分。