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