0

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

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

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

3)否则什么都不做

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

5)将其写入文件receipt.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
4

1 回答 1

2

两者之一和/或两者。

什么?如何?

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

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

Shellscript 格式化

Thegrep和 firstawk位于各自的行中,它们不以管道或反斜杠结尾。那不是管道,它只是一堆命令。如果您使用的是 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 中,以 结尾的行|会自动继续 - 不需要尾随反斜杠。)

于 2013-04-27T04:24:16.267 回答