awk printf 第一个模式之后每行的所有文本(包括它)

awk printf 第一个模式之后每行的所有文本(包括它)

示例操作:

原文:

% echo -e "This is number 800 with decimal;other stuff\n44333; more data"
This is number 800 with decimal;other stuff
44333; more data

期望的 awk 结果:

% echo -e "This is number 800 with decimal;other stuff\n44333; more data" | awk
;other stuff
; more data

更新:毕竟答案:分隔符“;”每行仅一次,并且如果行存在则存在,因此我的解决方案将始终有效,但它不像其他解决方案那么通用(考虑空白行、没有分隔符的行或具有多个分隔符的行)。

答案1

在每个 Unix 机器上的任何 shell 中使用任何 awk 或 sed:

awk '{sub(/[^;]*/,"")}1' file

sed 's/[^;]*//' file

但上面的代码会为任何不包含的行打印空行;,因此如果您的输入中可以存在此类行,那么这可能就是您想要的:

awk '{sub(/[^;]*;/,";")}1' file

sed 's/[^;]*;/;/' file

上面假设您希望;按原样打印任何不包含 s 的行,或者您可能希望删除这些行:

awk 'sub(/[^;]*;/,";")' file

sed -n 's/[^;]*;/;/p' file

答案2

awk -F ';' 'BEGIN { OFS=FS } { $1 = "" }; 1'

这将读取每行的;- 分隔字段并将第一个此类字段设置为空字符串。然后,所有行都将作为输出字段分隔符无条件输出(这就是孤行在1最后所做的事情) 。;

鉴于您问题中的数据,这会生成

;other stuff
; more data

另一个测试:

$ cat file
123;456;789
a b c ; d e f ; g h i

abba
;;;;
$ awk -F ';' 'BEGIN { OFS=FS } { $1 = ""; print }' file
;456;789
; d e f ; g h i


;;;;

答案3

使用您显示的示例,请尝试以下awk代码。

echo -e "This is number 800 with decimal;other stuff\n44333; more data" |
awk 'match($0,/^[^;]*/){ print substr($0,RSTART+RLENGTH)}'

;other stuff
; more data

答案4

简单的

% echo -e "This is number 800;other stuff\n44333; more data" | awk -F';' '{print ";"$2}'
;other stuff
; more data

相关内容