使用 awk 写入一些字符串

使用 awk 写入一些字符串

我有 4 列文本数据,但最后一列是文本(包含变量字符串),如下所示

Column1 Column2 Column3 Column4
5678    567     56      hello
1234    123     12      hello there

我想使用awk类似命令仅写入或显示第 4 列: awk '{print $4}'但 column4 仅显示第一个字符串。我怎样才能使用awk或任何其他格式命令显示文本。

谢谢。

答案1

我认为最简单的方法可能是混合使用tr(确保每列之间只有一个空格)并cut抓取第 4 列和后续列:

$ cat test.txt | tr -s ' ' | cut -f 4- -d ' '
Column4
hello
hello there

如果您确定所有列都已对齐,并且带有空格(而非制表符),那么这会更短:

$ cut -c 25- < test.txt
Column4
hello
hello there

强制性awk解决方案如下:

$ awk '{ $1=$2=$3=""; print $0 }' < test.txt
   Column4
   hello
   hello there

与前两个解决方案相比,请注意输出每行开头的空格。

答案2

当您使用 {print $4} 时,第 4 列会被分割,因为 awk 将空格(例如“hello”和“there”之间的空格)解释为分隔符,而在此示例中,“there”位于字段 5 中。

根据文件的具体格式,可能会有多种答案(有些比其他更简单)。

如果所有列都由一个制表符分隔,则使用

awk -F \t '{print $4}' (此处的 -F 将文件分隔符设置为单个制表符)

如果所有列都由一个或多个制表符分隔,则使用

awk -F '[\t]+' '{print $4}' (此处的 -F 将字段分隔符设置为一个或多个制表符)

如果前三列的字符数始终是固定的(比如 20),那么使用

awk '{print substr($0, 21)}'

(substr 命令只是打印输入字符串从第 21 个字符到末尾的部分)

或者,如果以上都不行

awk '{for (i=4; i<=NF; i++) printf "%s ", $i print ""}'

(此循环打印从第四个到行末的所有字段)

答案3

如果输入文件的格式是每列由两个或多个空格分隔,并且第 4 列中的有效条目在一行中永远不会有超过一个空格,则可以使用以下解决方案,其中字段分隔符设置为两个或多个空格。

awk -F " [ ]+" '{print $4}'

示例输出:

hello hello there

(请注意,标题“Column4”被拒绝,因为每个标题之间只有一个空格)

相关内容