我有包含以下内容的文件:
Text1 , Text11 : APC signal 0 , prev=7
Text2 , Text22 : APC signal 1 , prev=0
Text3 , Text33 : APC signal 0 , prev=1
Text4 , Text44 : APC signal 1 , prev=0
Text5 , Text55 : APC signal 0 , prev=1
Text6 , Text66 : APC signal 1 , prev=0
我想提取第一列和第三列,但只是第二列的子字符串(“:”之后的第二部分):
我想要的结果:
Text1 , APC signal 0 , prev=7
Text2 , APC signal 1 , prev=0
Text3 , APC signal 0 , prev=1
Text4 , APC signal 1 , prev=0
Text5 , APC signal 0 , prev=1
Text6 , APC signal 1 , prev=0
答案1
使用sed
sed 's/, [^:]*:/, /' file
这将搜索以逗号和空格 ( ,
) 开头的文本,后跟尽可能多的非冒号 ( [^:]*
),然后是冒号本身 ( :
)。然后用逗号和空格 ( ,
) 替换它以获得所需的输出:
Text1 , APC signal 0 , prev=7
Text2 , APC signal 1 , prev=0
Text3 , APC signal 0 , prev=1
Text4 , APC signal 1 , prev=0
Text5 , APC signal 0 , prev=1
Text6 , APC signal 1 , prev=0
如果您实际上不希望第一个逗号后显示两个空格,请将第二次出现的逗号空格 ( ,
) 更改为单个逗号 ( ,
)。
答案2
使用awk
:
$ awk -F, '{sub(/.*:/, "", $2); }1' OFS="," file
Text1 , APC signal 0 , prev=7
Text2 , APC signal 1 , prev=0
Text3 , APC signal 0 , prev=1
Text4 , APC signal 1 , prev=0
Text5 , APC signal 0 , prev=1
Text6 , APC signal 1 , prev=0
内置awk
功能子工作原理为
sub(regexp, replacement [, target])
.
答案3
像这样使用awk:
$ awk -F' , | : ' -vOFS=' , ' '{print $1, $3, $4}' file
-------8<------------------
Text1 , APC signal 0 , prev=7
Text2 , APC signal 1 , prev=0
Text3 , APC signal 0 , prev=1
Text4 , APC signal 1 , prev=0
Text5 , APC signal 0 , prev=1
Text6 , APC signal 1 , prev=0