按列模式创建文件

时间:2017-02-09 10:09:07

标签: shell awk

我想按照第一列值创建文件,假设我在文件中有ASCII数据,其中包含..

400.00     1234
400.00     2134
400.05     4314
400.05     9766
401.00     9874
401.00     7982
402.50     1234

现在我想写一个shell或awk脚本,它创建一个名为" Timestep_401.00" 的文件,并且只包含属于该列值的记录,即它应该包含....

401.00    9874
401.00    7982

我正在尝试下面的脚本..

awk '{ if($1=401.00) {print >> "Timestep_"$1; close($1)}}' awk.txt

但它提供了错误的输出(虽然 Timestep_400 文件是作为输出创建的),因为它包含文件中的所有数据。只是第一列的值和输入文件第二列的所有记录。  Timestep_400文件的内容

401.00     1234
401.00     2134
401.00     4314
401.00     9766
401.00     9874
401.00     7982
401.00     1234

1 个答案:

答案 0 :(得分:1)

看起来您的脚本出现的主要问题是拼写错误:=是作业,而不是比较。

就个人而言,我会使用字符串比较,以避免考虑与浮点值相关的问题(并且因为awk无论如何都将字段视为字符串)。

我也会丢失不必要的if,因为awk脚本的工作方式与condition { action }类似。

awk '$1 == "401.00" { print > ("Timestamp_"$1) }' awk.txt

我猜你要使用>代替>>>表示“打开并截断文件”,但在后续行中,文件已经打开,因此将附加到。如果在运行脚本之前已存在Timestamp_401.00并且您要保留其内容,请使用>>

我想您的意思是close您刚刚写入的文件但是没有必要每行执行一次 - 事实上,这意味着>重新打开(并截断)了每次执行块时都会生成文件。