awk:使用getline - 禁止用户输入的打印消息仅打印到终端而不输出文件

时间:2014-02-20 18:54:02

标签: awk

这可能很容易解决,但我似乎无法得到。使用awk脚本,我试图在每条记录的开头插入一个2位数的代码,提示用户不要将用户消息本身打印到新文件。输入文件的示例:

cat datafile1                 
V12309012548458631659
V34509012548458683659
V45709012548458672659

...所需的输出是:

cat datafile2
57 V12309012548458631659
57 V34509012548458683659
57 V45709012548458672659

但实际输出是:

cat datafile2
enter agency id:
57 V12309012548458631659
57 V34509012548458683659
57 V45709012548458672659

如何禁止在新数据文件2中打印“输入代理商ID:”消息以仅包含相关数据记录?

注意:我将其作为 可执行文件 运行,如下所示:“./ interactive.awk datafile1> datafile2”。

    #!/usr/bin/awk -f 
    BEGIN{
        print "enter agency id:";getline agy_id<"/dev/tty"} 
    {  
        print agy_id" "$1;
    }

非常感谢提前。

2 个答案:

答案 0 :(得分:2)

<强>更新

$ cat datafile1 
V12309012548458631659
V34509012548458683659
V45709012548458672659

$ cat script.awk 
BEGIN {
        printf "Enter Id: " ;  getline id < "-"
}
{
        print id, $1 > ARGV[2]
} 

$ awk -f script.awk datafile1 datafile2
Enter Id: 100

$ cat datafile2 
100 V12309012548458631659
100 V34509012548458683659
100 V45709012548458672659

答案 1 :(得分:2)

使用GNU awk for nextfile:

$ cat file1
V12309012548458631659
V34509012548458683659
V45709012548458672659

$ awk 'BEGIN{printf "enter agency id: " | "cat>&2"} NR==FNR{agy_id=$0; nextfile} {print agy_id, $0}' - file1 > file2
enter agency id: 57

$ cat file2
57 V12309012548458631659
57 V34509012548458683659
57 V45709012548458672659

对于其他awks,如果你想在awk中完成所有操作,使用getline将是最简单的方法:

$ awk 'BEGIN{printf "enter agency id: " | "cat>&2"; getline agy_id < "-"} {print agy_id, $0}' file1 > file2
enter agency id: 57

$ cat file2
57 V12309012548458631659
57 V34509012548458683659
57 V45709012548458672659

但实际上我只是使用shell来读取agy_id:

printf "enter agency id: "
read agy_id
awk -v agy_id="$agy_id" '{print agy_id, $0}' file1 > file2

不要使用shebangs从shell脚本调用awk,它只会剥夺你使用shell和awk的能力,以获得零利益。