Linux 带管道衬里的awk命令有些疑问

Linux 带管道衬里的awk命令有些疑问,linux,shell,Linux,Shell,我知道在下面的代码中,pipe命令将把输出传递给下一个命令。但我对awk死刑有疑问。我怀疑的是 是每个awk块将遍历文件中的所有行,还是它将逐个遍历该行。更清楚的是,正如我所想 1) 第一个awk块将迭代通过第一行 2) 如果条件满足,则打印该行。(将此信息传递到下一个awk块) 3) 否则什么也不做 4) 下一个awk块接收该输出并处理该特定行 5) 将其写入filereceive.tmp 以这种方式进行处理或 1) 第一个awk块将遍历该文件中的所有行 2) 将输出传递到下一个awk块 3)

我知道在下面的代码中,pipe命令将把输出传递给下一个命令。但我对awk死刑有疑问。我怀疑的是 是每个awk块将遍历文件中的所有行,还是它将逐个遍历该行。更清楚的是,正如我所想

1) 第一个awk块将迭代通过第一行

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

3) 否则什么也不做

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

5) 将其写入filereceive.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
要么和/或两者兼而有之

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

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

shell脚本格式
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中,以
|
结尾的行将自动继续-不需要尾随反斜杠。)

非常感谢您的详细解释。您可能还需要将
grep-v
重构为第一个Awk脚本<代码>awk'/^traile/{…}'/tmp/pay.dat |…实际上,您可以轻松地将两个Awk脚本合并为一个。开始时,
/^TRAILER/{next}substr($0145,2)=“CA”{next}…
@tripleee两者都可以;然而,我不是一个Awk巫师,我担心会引入新手错误。