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
Shell 拆分(使用指定的分隔符)选定列_Shell_Unix_Awk - Fatal编程技术网

Shell 拆分(使用指定的分隔符)选定列

Shell 拆分(使用指定的分隔符)选定列,shell,unix,awk,Shell,Unix,Awk,我有一个制表符分隔的文件,想修改它。最后一列是以管道分隔的,我希望将该列拆分(从管道到选项卡),同时避免使用管道拆分其他列 这可以将管道转换为选项卡,但我无法让它仅对选定的列13进行拆分。有没有一种方法可以让这项工作只在最后一列上进行,而不必指定它 awk -F'|' '$13=$13' OFS="\t" inputfile.tsv > split.tsv 让我们考虑这个制表符分隔的测试文件: $ cat file a|b c|d e|f g one tw

我有一个制表符分隔的文件,想修改它。最后一列是以管道分隔的,我希望将该列拆分(从管道到选项卡),同时避免使用管道拆分其他列

这可以将管道转换为选项卡,但我无法让它仅对选定的列13进行拆分。有没有一种方法可以让这项工作只在最后一列上进行,而不必指定它

awk -F'|' '$13=$13' OFS="\t" inputfile.tsv > split.tsv

让我们考虑这个制表符分隔的测试文件:

$ cat file
a|b     c|d     e|f     g
one     two     three   four
要在
|
上拆分第三列,请执行以下操作:

$ awk -F'\t' '{gsub(/[|]/, "\t", $3)} 1' OFS='\t' file
a|b     c|d     e       f       g
one     two     three   four
对于您的文件,您需要将
$3
替换为
$13

awk -F'\t' '{gsub(/[|]/, "\t", $13)} 1' OFS='\t' file
或者,要替换最后一列(无论是哪列),请使用:

awk -F'\t' '{gsub(/[|]/, "\t", $NF)} 1' OFS='\t' file
工作原理
  • -F'\t'
    在选项卡的输入上设置字段分隔符

  • gsub(/[|]/,“\t”,$13)
    用字段
    $13
    中的选项卡替换

  • awk -F'\t' '{gsub(/[|]/, "\t", $13)} 1' OFS='\t' file
    
  • 1
    是awk用于打印行的神秘缩写

  • OFS='\t'
    告诉awk在输出时使用一个选项卡作为字段分隔符

替代形式 如果只对
\t
进行一次编码而不是三次编码,可能会更清晰、更易于维护。在这种情况下(帽尖:):


让我们考虑这个制表符分隔的测试文件:

$ cat file
a|b     c|d     e|f     g
one     two     three   four
要在
|
上拆分第三列,请执行以下操作:

$ awk -F'\t' '{gsub(/[|]/, "\t", $3)} 1' OFS='\t' file
a|b     c|d     e       f       g
one     two     three   four
对于您的文件,您需要将
$3
替换为
$13

awk -F'\t' '{gsub(/[|]/, "\t", $13)} 1' OFS='\t' file
或者,要替换最后一列(无论是哪列),请使用:

awk -F'\t' '{gsub(/[|]/, "\t", $NF)} 1' OFS='\t' file
工作原理
  • -F'\t'
    在选项卡的输入上设置字段分隔符

  • gsub(/[|]/,“\t”,$13)
    用字段
    $13
    中的选项卡替换

  • awk -F'\t' '{gsub(/[|]/, "\t", $13)} 1' OFS='\t' file
    
  • 1
    是awk用于打印行的神秘缩写

  • OFS='\t'
    告诉awk在输出时使用一个选项卡作为字段分隔符

替代形式 如果只对
\t
进行一次编码而不是三次编码,可能会更清晰、更易于维护。在这种情况下(帽尖:):


您应该添加具有预期输出的示例输入您应该添加具有预期输出的示例输入
n=
可能不必要<代码>\\\\表示法少一个字符。也可能是
$NF
来识别最后一个字段。还可以在
gsub
中使用
OFS
,以保持一致性。@karakfa谢谢。答案已更新,以删除多余的
n=
,并提供
$NF
选项。(我习惯于使用
[|]
,即使是以增加一个字符为代价,因为同样的表单在POSIX(“basic”)正则表达式下也可以使用。当然,其他人可能有很好的理由使用其他习惯。)谢谢,这非常有效。我无法通过“split”函数,现在看到gsub函数实际上是缺少的元素。
n=
可能没有必要<代码>\\\\表示法少一个字符。也可能是
$NF
来识别最后一个字段。还可以在
gsub
中使用
OFS
,以保持一致性。@karakfa谢谢。答案已更新,以删除多余的
n=
,并提供
$NF
选项。(我习惯于使用
[|]
,即使是以增加一个字符为代价,因为同样的表单在POSIX(“basic”)正则表达式下也可以使用。当然,其他人可能有很好的理由使用其他习惯。)谢谢,这非常有效。我无法通过“split”函数,现在看到gsub函数确实是缺少的元素。