awk在匹配的标记打印中插入行/记录

时间:2017-07-13 14:54:26

标签: awk gawk

Awk程序应处理许多数据文件。在每个数据文件中,它应查找模式并使用新字段插入两行/记录。 (这只是一个例子。最终的程序必须在此操作旁边做更多的事情。)

datafile(s)为例

BEGIN { OFS=FS="\t"}

FNR==1 {flag=0;} p; 
#flag && $1!=""{$1=$1; print}

$1=="Record-2" && flag{$1="";$2="newline1"; print; $1=""; $2="newline2"; print}
#$1=="Record-2" {flag=1} p {$1=""; $2="newline1"; print; $1=""; $2="newline2"; print; flag=0} 1

flag!=0{print};
/start/{flag=1}

它是制表符分隔的,这里我们只有1美元。

源程序

Record-1
        newline1
        newline2
Record-n

由于我使用Windows,因此通过GAWK调用。

想要输出:

Record-1
        newline1
        newline2
        newline2
Record-n

关于“newline2”的出版问题我的输出

FNR==1 {flag=0;} p; 
...    
flag!=0{print};
/start/{flag=1}

我认为这个问题与“旗帜”的使用有关。但是为了在工作中执行我的awk程序的所有其他操作

import org.openqa.selenium.SessionNotCreatedException;
import org.openqa.selenium.remote.DesiredCapabilities;

import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.remote.AndroidMobileCapabilityType;
import io.appium.java_client.remote.MobileCapabilityType;

public class AppiumUtils {

    public static AndroidDriver<AndroidElement> driver = null;


    public AndroidDriver<AndroidElement> connectByPackageActivity(String deviceName, 
                                                                  String appPackage, 
                                                                  String appActivity) {

        String url = "http://127.0.0.1:4723/wd/hub";

        DesiredCapabilities capabilities = new DesiredCapabilities();

        capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, deviceName);
        capabilities.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, appPackage);
        capabilities.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, appActivity);

        try {
            driver = new AndroidDriver<AndroidElement>(new URL(url), capabilities);
            driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
        } catch (SessionNotCreatedException e) {
            System.err.println("Unable to create Appium session");
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return driver;

    }

}

应该保持不变 - 只要它不会“伤害”。谢谢。

1 个答案:

答案 0 :(得分:0)

正如你所说,因为flag,最后一次

flag!=0{print};

正在进行额外的打印,因此您可以删除$1=="Record-2" ...中的最后一次打印:

BEGIN { OFS=FS="\t"}

FNR==1 {flag=0} 
#flag && $1!=""{$1=$1; print}

$1=="Record-2" && flag{$1="";$2="newline1"; print; $2="newline2"}
#$1=="Record-2" {flag=1} p {$1=""; $2="newline1"; print; $1=""; $2="newline2"; print; flag=0} 1

flag!=0{print}
/start/{flag=1}

另一种选择可能是向flag添加另一个条件,但不知道这是否会弄乱你的脚本:

BEGIN { OFS=FS="\t"}

FNR==1 {flag=0} 
#flag && $1!=""{$1=$1; print}

$1!="Record-2" && flag!=0 {print}

$1=="Record-2" && flag{$1="";$2="newline1"; print; $2="newline2"; print}
#$1=="Record-2" {flag=1} p {$1=""; $2="newline1"; print; $1=""; $2="newline2"; print; flag=0} 1

/start/{flag=1}

或者:

BEGIN { OFS=FS="\t"}

FNR==1 {flag=0} 
#flag && $1!=""{$1=$1; print}

$1=="Record-2" && flag{$2="newline1"; print "\t"$2; $2="newline2"; print "\t"$2}
#$1=="Record-2" {flag=1} p {$1=""; $2="newline1"; print; $1="";    $2="newline2"; print; flag=0} 1

$1!="Record-2" && flag!=0{print}
/start/{flag=1}