使用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
假设我有一个这样的文件(免责声明:这不是固定的我可以有超过 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