文本操作和修改



我是一个脚本初学者,尝试从头开始学习。从我发布的几个问题中,我从这个社区中受益匪浅,学到了很多东西。虽然我不敢再在这里问这么天真的问题,但我敢在这里再问一次,所以请帮忙。。

我有一个文件:

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$000在概念上是输出字段(这使,表示法感觉很自然),并且如果只在一个地方提及,则更改输出字段分隔符(稍微)更容易。

由于这是对单个行的简单替换,因此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替代词。

最新更新