我有 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”被拒绝,因为每个标题之间只有一个空格)