使用AWK缓冲输出

时间:2015-06-26 05:06:04

标签: awk

我有一个输入文件,它由三部分组成:

inputFirst
inputMiddle
inputLast

目前我有一个AWK脚本,通过此输入创建一个输出文件,该文件由两部分组成:

outputFirst
outputLast

其中 outputFirst outputLast 分别从 inputFirst inputLast 生成(动态)。但是,要计算 outputMiddle 部分(只有一行),我需要扫描整个输入,所以我将它存储在一个变量中。问题是此变量的值应该在输出文件中的 outputFirst outputLast 之间。

有没有办法使用不带参数的单个可移植AWK脚本来解决这个问题?是否有可移植的方法在AWK脚本中创建临时文件,还是应该将 outputFirst outputLast 的输出存储在两个变量中?我怀疑使用变量对大文件来说效率很低。

3 个答案:

答案 0 :(得分:0)

所有版本的AWK(至少从1985年开始)都可以对文件或管道进行基本的I / O重定向,就像shell一样,并且可以在没有I / O重定向的情况下运行外部命令。

因此,有许多方法可以解决您的问题并解决它,而无需将整个输入文件读入内存。最佳解决方案将取决于您正在尝试做什么,以及您必须遵守的约束条件。

您在上面的评论中描述的更精确的示例问题的简单方法可能是这样的:首先在BEGIN子句中形成两个带rand()的唯一文件名(并定义您的变量) ,然后从标准输入读取和求和前50个数字,同时将它们写入临时文件,然后继续读取并汇总接下来的50个数字并将它们写入第二个文件,最后在END子句中将使用循环来读取第一个临时文件getline并将其写入标准输出,打印总和,然后以相同的方式读取第二个临时文件并将其写入标准输出,最后调用{{1删除临时文件。

答案 1 :(得分:0)

处理文件时打印“第一个”输出,然后将余数写入临时文件,直到你写完中间文件。

这是一个自包含的shell脚本,它处理输入文件并写入标准输出。

import SpriteKit


class GameScene: SKScene, SKPhysicsContactDelegate {

let character = SKSpriteNode(texture: SKTexture(imageNamed: "character"))
var move = false

override func didMoveToView(view: SKView) {
    /* Setup your scene here */
    //world
    self.physicsWorld.gravity = CGVectorMake(0.0, -5.0)
    self.physicsWorld.contactDelegate = self
    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)

    //background
    var background = SKSpriteNode(imageNamed: "background")
    background.size.height = self.frame.size.height
    background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
    self.addChild(background)


    //character
    character.position = CGPointMake(self.frame.size.width * 0.6, self.frame.size.height * 0.6)
    character.setScale(0.015)
    character.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(character.size.width / 2))
    character.physicsBody?.dynamic = true
    self.addChild(character)


    //platform 1
    var platformTexture = SKTexture(imageNamed: "platform")
    var platform = SKSpriteNode(texture: platformTexture)
    platform.position = CGPointMake(self.frame.size.width * 0.6, CGRectGetMidY(self.frame))
    platform.physicsBody = SKPhysicsBody(rectangleOfSize: platform.size)
    platform.physicsBody?.dynamic = false
    platform.setScale(0.25)
    self.addChild(platform)

    //platform 2
    var platformTexture2 = SKTexture(imageNamed: "platform")
    var platform2 = SKSpriteNode(texture: platformTexture2)
    platform2.position = CGPointMake(self.frame.size.width * 0.4, self.frame.size.height * 0.3)
    platform2.physicsBody = SKPhysicsBody(rectangleOfSize: platform2.size)
    platform2.physicsBody?.dynamic = false
    platform2.setScale(0.25)
    self.addChild(platform2)


    //platform main
    var platformTexture3 = SKTexture(imageNamed: "platform")
    var platform3 = SKSpriteNode(texture: platformTexture2)
    platform3.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMinY(self.frame) + platform3.size.height / 3)
    platform3.physicsBody = SKPhysicsBody(rectangleOfSize: platform3.size)
    platform3.physicsBody?.dynamic = false
    platform3.setScale(1)
    platform3.size.width = platform3.size.width * CGFloat(2.0)
    self.addChild(platform3)


}

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
   var charPos = character.position
    /* Called when a touch begins */
   for touch: AnyObject in touches {
    let location = touch.locationInNode(self)
    //Hold finger at upper area to move character constantly to the right.
    if location == charPos{
        character.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 20))
    }
    else {

    }
    if location.y > 400{
        //moving allowed, force is applied in update method. read the docs about applyImpulse and applyForce methods and the differences between those two.
        move = true

    }else{

        if location.x < CGRectGetMidX(self.frame){
            character.physicsBody?.applyImpulse(CGVector(dx: -10, dy: 0))
        } else if location.x > CGRectGetMidX(self.frame){
            character.physicsBody?.applyImpulse(CGVector(dx: 10, dy: 0))
                        }
    }

}

}
override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {

}
}



 func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */
}

为了便于说明,我使用了非常大的行号。我担心你的问题仍然太模糊,无法真正获得一般性的答案,但也许这可以帮助你找到正确的方向。

答案 2 :(得分:0)

如果输出文件不是太大(无论是什么),将 outputLast 保存在变量中是非常合理的。第一部分 outputFirst 可以(如上所述)动态生成。我试过这种方法,但效果很好。