我知道在下面的代码中,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
答案 0 :(得分:2)
两者之一和/或两者兼而有之。
每个awk
将迭代给定的行 - 第一个awk
接收不以“TRAILER”开头的行,第二个接收第一个给它的行。这些过程并行执行,每个过程都可以随意读取和写入数据。 (尝试读取尚未写入的数据的进程将在该数据可用之前休眠。)
任何副作用发生的顺序是不可预测的,具体取决于系统进程调度(包括当前负载),管道缓冲区大小,awk
执行开销等。
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中,以|
结尾的行会自动继续 - 不需要反斜杠。)