Text 文本操作和修改

Text 文本操作和修改,text,awk,Text,Awk,我是一名脚本初学者,试图从头开始学习。 从我发布的几个问题中,我从这个社区受益匪浅,学到了很多东西。 虽然我不敢在这里再问这样一个幼稚的问题,但我敢在这里再问一次,所以请帮忙 我有一个文件: 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

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

我有一个文件:

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 "\t0\t0" }' filename
这告诉awk将行拆分为以
作为分隔符的字段,然后打印字段1和2(
$1
$2
),后面是一个制表符,后面是整行(
$0
),后面是
“\t0\t0”
,其中
\t
代表制表符

或者,如果你愿意

awk -F _ -v OFS='\t' '{ print $1 $2, $0, 0, 0 }' filename
这是一个比较好的选择。第一个在使用的机制方面比较简单,但我更喜欢第二个,因为
$1$2
$0
0
0
是概念上的输出字段(这使
符号感觉自然),而且它(有点)如果只在一个地方提到输出字段分隔符,则更容易更改它。

最简单的方法是:

awk -F _ '{ print $1 $2 "\t" $0 "\t0\t0" }' filename
这告诉awk将行拆分为以
作为分隔符的字段,然后打印字段1和2(
$1
$2
),后面是一个制表符,后面是整行(
$0
),后面是
“\t0\t0”
,其中
\t
代表制表符

或者,如果你愿意

awk -F _ -v OFS='\t' '{ print $1 $2, $0, 0, 0 }' filename

这是一个比较好的选择。第一个在使用的机制方面比较简单,但我更喜欢第二个,因为
$1$2
$0
0
0
是概念上的输出字段(这使
符号感觉自然),而且它(有点)如果只在一个地方提到输出字段分隔符,则更容易更改它。

由于这是对单个行的简单替换,因此sed的发明就是为了做到这一点,并且做得很好:

$ sed -r 's/([^_]+)_([^_]+).*/\1\2\t&\t0\t0/' 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替代品。

由于这是对单个线路的简单替代,因此sed的发明就是为了做到这一点,并且做得很好:

$ sed -r 's/([^_]+)_([^_]+).*/\1\2\t&\t0\t0/' 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替代方案。

Google
uooc
wrt
cat file.
。Google
uooc
wrt
cat file.
。非常感谢Ed!我也会练习sed。学习、学习……-)sed很简单,你应该使用它来做任何事情lse你应该使用awk,所以不要试图学习sed(你会想到的)获得Arnold Robbins的《有效的awk编程》一书,并专注于学习这本书,在此过程中,你将了解awk gensub()函数实现了sed的功能。非常感谢Ed!我也将练习sed。学习,学习…-)sed很简单,您只需使用它来实现
s/old/new/
。对于其他任何功能,您都应该使用awk,所以不要尝试学习sed(它只会出现在您身上)获取Arnold Robbins的《有效的Awk编程》一书,重点学习这本书,在此过程中,您将了解Awk gensub()函数,它完成sed的功能。