使用awk选择给定列时如何保留换行符

how to keep newline(s) when selecting a given column with awk

假设我有一个这样的文件(免责声明:这不是固定的我可以有超过 7 行和超过 4 列)

R H A 23
S E A 45
T E A 34
U   A 35
Y T A 35
O E A 353
J G B 23

如果第三列是 A 但保留换行符或白色 space 字符,我希望输出到 select 第二列。

输出应该是:

HEE TE

我试过这个:

awk '{if (=="A") print }' file | awk 'BEGIN{ORS = ""}{print }'

但这给出了:

HEETE%

其中有一个奇怪的 % 并且缺少 space。

您可以使用此 gnu-awk 解决方案 FIELDWIDTHS:

awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1 *" }  == "A" {s = s }
END {print s}' file

HEE TE

awk 使用此变量 FIELDWIDTHS.

中提供的宽度值拆分每条记录

1 1 1 1 1 1 * 表示前 6 列中的每一列都将具有单个字符长度,其余文本将填充在第 7 列中。由于每个值后都有一个 space,因此 ,, 将填充一个 space,而 ,, 将填充输入中提供的值。

== "A" {s = s }:这里我们检查 </code> 是否为 <code>A,如果该条件为真,则我们继续将 </code> 的值附加到变量 <code>s.在 END 块中,我们只打印变量 s.

如果不使用固定宽度解析,awk 会将第 4 行的 A 视为 </code>。</p> <hr /> <p>否则,如果我们让 spaces 成为列值的一部分,则使用:</p> <pre><code>awk ' BEGIN{ FIELDWIDTHS = "2 2 2 *" } == "A " {s = s substr(,1,1)} END {print s} ' file