我有一个2k数据的文件,我想只获取updr / udrl / imgr / imgl字段的数字值为41110.00 120 996.00 523,并在其中存在updr / updl / imgr / imgl字段的位置将制表符分隔开。
我尝试过用单个模式替换直到方括号,但是之后无法应用另一个模式来获取数字。
echo `sed -n 's/^\[.*][^0-9]*[[:space:]]* //p' client_stat.txt > client_stat_onlyData.csv` ; echo `sed -i 's/ /\t/g' client_stat_onlyData.csv`
我将得到如下所示的o / p,但是我不想打印udpr / updl / imgr / imgl字符串,我只想打印数字值。
updr 48358.00 updl 120 imgr 1015.00 imgl 523
updr 48562.00 updl 120 imgr 1169.00 imgl 523
updr 48305.00 updl 121 imgr 1210.00 imgl 523
updr 48285.00 updl 121 imgr 1135.00 imgl 523
updr 48459.00 updl 121 imgr 1210.00 imgl 523
updr 48246.00 updl 120 imgr 881.00 imgl 523
updr 48439.00 updl 120 imgr 1109.00 imgl 523
连接数= 1 创建RSSL连接主机:192.168.120.1端口:14002 UPA服务器组件版本:ads3.2.2.L1.linux.tis.rrg 64位 设置rmds连接0x10a8900 连接列表数为1 支持待机:0 SupportBatchRequests初始开放时间:是 重新发出SupportBatchRequests:是 支持批量关闭:是 SupportViewRequests:是 SupportOptimizedPauseResume:0
[Tue Feb 19 14:42:50.415] updr 41110.00 updl 120 imgr 996.00 imgl 523
[Tue Feb 19 14:42:51.415] updr 49368.00 updl 121 imgr 845.00 imgl 523
Status Received <388> Status Text: Stale Status for Item REC1000017 Text: F7: Item Preempted
[Tue Feb 19 14:42:52.415] updr 48542.00 updl 121 imgr 1170.00 imgl 523
Status Received <1166> Status Text: Stale Status for Item REC1000410 Text: F7: Item Preempted
[Tue Feb 19 14:42:53.415] updr 47942.00 updl 120 imgr 1133.00 imgl 523
Status Received <1133> Status Text: Stale Status for Item REC1001609 Text: F7: Item Preempted
[Tue Feb 19 14:42:54.415] updr 48513.00 updl 120 imgr 1100.00 imgl 523
答案 0 :(得分:0)
请尝试以下操作(它将在提及的OP旁边显示字符串旁边的数字)。
awk '{for(i=1;i<=NF;i++){if($i ~ /^(updr|udrl|imgr|imgl)$/){val=val?val OFS $(i+1):$(i+1)}};print val;val=""}' Input_file
或添加非单一衬里形式的解决方案。
awk '
{
for(i=1;i<=NF;i++){
if($i ~ /^(updr|udrl|imgr|imgl)$/){
val=val?val OFS $(i+1):$(i+1)
}
}
print val
val=""
}
' Input_file
如果要将输出保存到Input_fie本身,请在上面的代码中附加> temp_file && mv temp_file Input_file
。同样,如果您的Input_file是用TAB分隔的,而您想以TAB分隔的格式输出,则将awk
的代码从awk 'BEGIN{FS="OFS="\t"}
更改为{for....
,如上所述。
说明: 添加上述代码的说明。
awk ' ##Starting awk program here.
{ ##Startig conditions BLOCK here.
for(i=1;i<=NF;i++){ ##Starting a for lop here from variable i value 1 to till value of NF, where NF is awk OOTB variable and have value of number of fields in current line.
if($i ~ /^(updr|udrl|imgr|imgl)$/){ ##Checking condition if current field value is startig with strings either updr OR udrl OR imgr OR imgl and ends with any of these then do following.
val=(val?val OFS $(i+1):$(i+1)) ##Creating variable val whose value is keep concatenating its own previous value here.
} ##Closing BLOCK for if condition here.
} ##Closing BLOCK for for loop here.
print val ##Printing value of variable val here.
val="" ##Nullifying variable val value here.
} ##Closing main BLOCK now.
' Input_file ##Mentioning Input_file name here.
编辑: 代码运行示例。
awk '{for(i=1;i<=NF;i++){if($i ~ /^(updr|udrl|imgr|imgl)$/){val=val?val OFS $(i+1):$(i+1)}};print val;val=""}' Input_file
48358.00 1015.00 523
48562.00 1169.00 523
48305.00 1210.00 523
48285.00 1135.00 523
48459.00 1210.00 523
48246.00 881.00 523
48439.00 1109.00 523
答案 1 :(得分:0)
使用Perl单线版
perl -ne ' while( /(updr|udrl|imgr|imgl)\s+(\S+)/g ) { print "$2 " } print "\n" ' file
使用您给定的输入
$ cat vijaya.txt
updr 48358.00 updl 120 imgr 1015.00 imgl 523
updr 48562.00 updl 120 imgr 1169.00 imgl 523
updr 48305.00 updl 121 imgr 1210.00 imgl 523
updr 48285.00 updl 121 imgr 1135.00 imgl 523
updr 48459.00 updl 121 imgr 1210.00 imgl 523
updr 48246.00 updl 120 imgr 881.00 imgl 523
updr 48439.00 updl 120 imgr 1109.00 imgl 523
$ perl -ne ' while( /(updr|udrl|imgr|imgl)\s+(\S+)/g ) { print "$2 " } print "\n" ' vijaya.txt
48358.00 1015.00 523
48562.00 1169.00 523
48305.00 1210.00 523
48285.00 1135.00 523
48459.00 1210.00 523
48246.00 881.00 523
48439.00 1109.00 523
$