我是一个脚本初学者,尝试从头开始学习。从我发布的几个问题中,我从这个社区中受益匪浅,学到了很多东西。虽然我不敢再在这里问这么天真的问题,但我敢在这里再问一次,所以请帮忙。。
我有一个文件:
A_B_C_D_E
Q_W_F_R_S_G
F_B_E_G_W
T_Y_R_J_U
我想剪切由"_"分隔的第一个和第二个字符串,并输出为:
AB [tab] A_B_C_D_E [tab] 0 [tab] 0
QW [tab] Q_W_F_R_S_G [tab] 0 [tab] 0
FB [tab] F_B_E_G_W [tab] 0 [tab] 0
TY [tab] T_W_R_J_U [tab] 0 [tab] 0
我试过了:
cat file|tr "_" "t"|awk -F $'t' 'BEGIN {OFS = FS} {print $1$2,$1"_"$2"_"$3"_"$4"_"$5,"0","0"}
但这不能捕获具有6个字符串而不是5个字符串的第二行。
我很抱歉在这里问这样一个荒谬的问题。。但我非常感激!!
最简单的是:
awk -F _ '{ print $1 $2 "t" $0 "t0t0" }' filename
此命令告诉awk将行拆分为以_
为分隔符的字段,然后打印字段1和2($1
,$2
),然后打印制表符,然后打印整行($0
),再打印"t0t0"
,其中t
代表制表符。
或者,如果你愿意,
awk -F _ -v OFS='t' '{ print $1 $2, $0, 0, 0 }' filename
这是一个有点悬而未决的问题,哪一个更好。就所使用的机制而言,第一个更简单,但我更喜欢第二个,因为$1 $2
、$0
、0
和0
在概念上是输出字段(这使,
表示法感觉很自然),并且如果只在一个地方提及,则更改输出字段分隔符(稍微)更容易。
由于这是对单个行的简单替换,因此sed就是为了做这件事而发明的,而且做得很好:
$ sed -r 's/([^_]+)_([^_]+).*/12t&t0t0/' file
AB A_B_C_D_E 0 0
QW Q_W_F_R_S_G 0 0
FB F_B_E_G_W 0 0
TY T_Y_R_J_U 0 0
但看看@Wintermute的回答,找到一个完全合理的awk替代词。