awk命令管道衬里有些疑惑

时间:2013-04-27 04:00:42

标签: linux shell

我知道在下面的代码中,pipe命令会将输出传递给next命令。但我对awk执行的情况有疑问。我怀疑的是 每个awk块是否会遍历文件中的所有行,或者它将逐行遍历该行。更清楚,正如我所假设的......

1)第一个awk块将遍历第一行。

2)如果条件满足则打印该行。 (把它传递给下一个awk块)

3)否则什么都不做

4)下一个awk块收到此输出并处理该特定行。

5)将其写入filereceipt.tmp

以这种方式处理或

1)第一个awk块将遍历该文件中的所有行。

2)将输出传递到下一个awk块

3)下一个awk块将在输出的第一个awk块上运行。

请帮帮我。我没有选择这个命令。提前谢谢!

cat > /tmp/pay.dat
grep -v '^TRAILER' /tmp/pay.dat 

| \

awk '{
    if ((substr($0,145,2) != "CA")
    { 
        print $0 
    }
}'

|\

awk 'BEGIN{OFS=""} \
{
    if (substr($0,38,1) == "X") \
    { 
        print substr($0,1,37), "S", substr($0,39) 
    } \

     else { 
        print $0 
    }
}' > /tmp/receipt.tmp

1 个答案:

答案 0 :(得分:2)

两者之一和/或两者兼而有之。

什么?怎么样?

每个awk将迭代给定的行 - 第一个awk接收不以“TRAILER”开头的行,第二个接收第一个给它的行。这些过程并行执行,每个过程都可以随意读取和写入数据。 (尝试读取尚未写入的数据的进程将在该数据可用之前休眠。)

任何副作用发生的顺序是不可预测的,具体取决于系统进程调度(包括当前负载),管道缓冲区大小,awk执行开销等。

Shellscript格式

grep和第一个awk在他们自己的行上,不以管道或反斜杠结尾。这不是一个管道,它只是一堆命令。如果您使用的是Bourne shell或任何来自它的shell,则引用的字符串不需要反斜杠 - 它们会一直持续直到被结束引号中断。

尝试这样的事情:

# This assumes that your data is already in "/tmp/pay.dat".
grep -v "^TRAILER" /tmp/pay.dat |
awk 'your first
awk script' |
awk 'your second
awk script' > /tmp/receipt.tmp

(在Bourne派生的shell中,以|结尾的行会自动继续 - 不需要反斜杠。)