Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 替换以制表符分隔的文件中的封闭字符串中的制表符_Linux_Unix_Awk_Gsub - Fatal编程技术网

Linux 替换以制表符分隔的文件中的封闭字符串中的制表符

Linux 替换以制表符分隔的文件中的封闭字符串中的制表符,linux,unix,awk,gsub,Linux,Unix,Awk,Gsub,我有一个以制表符分隔的txt文件,其中第三列包含可能也有制表符的封闭字符串。由于这个额外的标签,当我试图读取这个标签分隔的文件时,我得到了5列。所以我想用空格替换标签 下面是示例文件 col1 col2 col3 col4 1 abc "pqr xyz" asd 2 asd "lmn pqr" aws 3 abc "asd" lmn 我想要这样的输出 col1 col2 col3

我有一个以制表符分隔的txt文件,其中第三列包含可能也有制表符的封闭字符串。由于这个额外的标签,当我试图读取这个标签分隔的文件时,我得到了5列。所以我想用空格替换标签

下面是示例文件

col1   col2   col3        col4  
1      abc    "pqr   xyz" asd  
2      asd    "lmn   pqr" aws  
3      abc    "asd"       lmn
我想要这样的输出

col1   col2   col3        col4  
1      abc    "pqr xyz"   asd  
2      asd    "lmn pqr"   aws  
3      abc    "asd"       lmn
这是我试过的

awk -F"\t" '{ gsub("\t","",$3); print $3 }' file.txt
之后,我得到以下输出

col3  
"pqr  
"lmn  
"asd"
请帮助使用GNU awk(gawk)您可以使用以下表达式:

gawk '{gsub("\t"," ",$3)}1' OFS='\t' FPAT='"[^"]*"|[^\t]*' file
这里的关键是
FPAT
变量。它定义了字段的外观,而不仅仅是指定字段分隔符

在我们的例子中,一个字段可以是包含在双引号中的非双引号字符序列
“[^”]*”
,也可以是零个或多个非制表符序列
[^\t]*
(零,用于正确处理空字段)

由于我们首先指定的是非引号字符序列,因此它具有优先级。

使用GNU awk(gawk),您可以使用以下表达式:

gawk '{gsub("\t"," ",$3)}1' OFS='\t' FPAT='"[^"]*"|[^\t]*' file
这里的关键是
FPAT
变量。它定义字段的外观,而不仅仅是指定字段分隔符

在我们的例子中,一个字段可以是包含在双引号中的非双引号字符序列
“[^”]*”
,也可以是零个或多个非制表符序列
[^\t]*
。(零,以正确处理空字段)


由于我们首先指定了非引号字符的序列,因此它有一个优先顺序。

非常感谢hek2mgl.^1并且为了完整性-在其他awk中,您将使用
awk'匹配($0,/“*”/){.tgt=substr($0,RSTART,RLENGTH);gsub(/\t/,“”,tgt);$0=substr($0,1,RSTART-1)tgt-substr($0,RSTART+RLENGTH)}.1'文件
Hi@hek2mgl,gawk'{gsub(“\t”,“”,$3)}1'OFS='\t'FPAT='“[^”]*“[^\t]+'文件在所有列都有一些值时工作正常。但是如果只有选项卡本身没有任何值,那么它就不会产生所需的输出。请您帮忙。@arshad有一个小错误。我编辑了答案,并将
[^\t]+
更改为
[^\t]*
FPAT
中。再试一次!它现在应该可以正常工作了。再次感谢@hek2mgl.^1和完整性-在其他awk中,您将使用
awk'match($0,/“*”/){tgt=substr($0,RSTART,RLENGTH);gsub(/\t/,“”,tgt);$0=substr($0,1,RSTART-1)tgt-substr($0,RSTART+RLENGTH)}1'file
Hi@hek2mgl,gawk'{gsub(“\t”,”,$3)}1'OFS='\t'FPAT='“[^”]*”[124;[^\ t]+'文件在所有列都有一些值时工作正常。但是如果只有选项卡本身没有任何值,那么它就不会产生所需的输出。请您帮忙。@arshad有一个小错误。我编辑了答案并更改了
[^\t]+
[^\t]*
FPAT
中。再试一次!现在应该可以正常工作了。再次感谢@hek2mgl