使用awk删除特定空格并替换为分号

使用awk删除特定空格并替换为分号,awk,Awk,我不熟悉linux和命令行。我正在试图找到一个命令,该命令允许我将除第一个以外的所有字段的空白(在.csv文本文件中)替换为分号。请看下面的例子,任何帮助都将不胜感激,我已经花了很长时间寻找解决方案。如果你有一个答案,请你解释一下命令,这样我就可以试着了解如何以及为什么。非常感谢 输入文本的示例: 0 k__Bacteria p__Firmicutes c__Bacilli 1 k__Bacteria p__Firmicutes c__Clostri

我不熟悉linux和命令行。我正在试图找到一个命令,该命令允许我将除第一个以外的所有字段的
空白
(在.csv文本文件中)替换为分号。请看下面的例子,任何帮助都将不胜感激,我已经花了很长时间寻找解决方案。如果你有一个答案,请你解释一下命令,这样我就可以试着了解如何以及为什么。非常感谢

输入文本的示例:

0   k__Bacteria  p__Firmicutes   c__Bacilli             
1   k__Bacteria  p__Firmicutes   c__Clostridia      
2   k__Bacteria  p__Bacteroidetes    c__Bacteroidia     
3   k__Bacteria  p__Bacteroidetes    c__Bacteroidia
我需要输出的是:

0   k__Bacteria;p__Firmicutes;c__Bacilli        
1   k__Bacteria;p__Firmicutes;c__Clostridia    
2   k__Bacteria;p__Bacteroidetes;c__Bacteroidia   
3   k__Bacteria;p__Bacteroidetes;c__Bacteroidia

您可以在python中这样做:

#!/usr/bin/env python
import sys

if __name__ == '__main__':
    for line in sys.stdin:
        cols = line.split()
        print ' '.join([cols[0], ';'.join(cols[1:])])
只需
chmod+xscript
文件并执行它
/script


请注意,line.split()将被多个空格分割,也就是说,
'ab\tc'
将在
['a','b','c']中产生

您可以在python中这样做:

#!/usr/bin/env python
import sys

if __name__ == '__main__':
    for line in sys.stdin:
        cols = line.split()
        print ' '.join([cols[0], ';'.join(cols[1:])])
只需
chmod+xscript
文件并执行它
/script


请注意,line.split()将被多个空格分割,也就是说,
'ab\tc'
将在
['a','b','c']

中产生
解决方案。它可能很脏,有人可以改进它,但它是有效的

awk'OFS=“;”{a=$1;$1=“;$0=a”;“$0}sub(/;;;/,”“,$0)”临时文本文件

输出为

0 k_Bacteria;p_Firmicutes;c_Bacilli
1 k_Bacteria;p_Firmicutes;c_Clostridia
2 k_Bacteria;p_Bacteroidetes;c_Bacteroidia
3 k_Bacteria;p_Bacteroidetes;c_Bacteroidia

编辑:根据评论更新

试试这个awk脚本
myawk.sh

 BEGIN { print "Begin Processing "}
   OFS=";"{
       $9=$9"%%"
   b = $0;
   split($0,a,"%%");
   gsub(/;/," ",a[1])
   print a[1]a[2]
   }
  END {print "Process Complete"}

使用
awk-f myawk.sh temp.txt执行,其中$9是要保留空格的变量uptill

这是解决方案,即
awk
。它可能很脏,有人可以改进它,但它是有效的

awk -v OFS=";" '{$1=$1" "$2;$2="";gsub(/;;/,";",$0);print}' your_file
awk'OFS=“;”{a=$1;$1=“;$0=a”;“$0}sub(/;;;/,”“,$0)”临时文本文件

输出为

0 k_Bacteria;p_Firmicutes;c_Bacilli
1 k_Bacteria;p_Firmicutes;c_Clostridia
2 k_Bacteria;p_Bacteroidetes;c_Bacteroidia
3 k_Bacteria;p_Bacteroidetes;c_Bacteroidia

编辑:根据评论更新

试试这个awk脚本
myawk.sh

 BEGIN { print "Begin Processing "}
   OFS=";"{
       $9=$9"%%"
   b = $0;
   split($0,a,"%%");
   gsub(/;/," ",a[1])
   print a[1]a[2]
   }
  END {print "Process Complete"}
使用
awk-f myawk.sh temp.txt执行,其中$9是要保留空格的变量uptill

awk -v OFS=";" '{$1=$1" "$2;$2="";gsub(/;;/,";",$0);print}' your_file
或者可以是perl语言:

perl -F -lane 'print join ";",@F' your_file| perl -pe 's/;/ /'
或者可以是perl语言:

perl -F -lane 'print join ";",@F' your_file| perl -pe 's/;/ /'


一个简单的问题,假设我有超过上面列出的4个字段(实际上有17个),并且希望保留超过上面所述的第一个字段(即,要保留前9个字段,只保留一个空格,其余字段用分号连接),我可以更改您的awk命令来执行此操作吗?如果是,怎么做?再次非常感谢。这真是一种享受!!非常感谢您的时间和帮助。只为我节省了数小时/数天的转圈时间!!其实我也是awk的新手,花了2个小时来解决你的问题。只是想了解更多。有经验的人应该在开始部分的第二次OFS任务中完成,而不是在身体的状况部分。你不用“b”。如果您想使用这种方法(我不会因为它会占用空白并依赖于%%不在输入中,而是在YMMV中),请完全删除OFS赋值,并将您的gsub()更改为
gsub(/[[:space:]+/,“;”,a[2])
。一个简单的问题,假设我有上面列出的4个以上的字段(实际上有17个)并且想要保留比上述第一个字段更多的字段(即,要保留前9个字段,仅保留一个空格,其余字段用分号连接),我可以更改您的awk命令来执行此操作吗?如果是,怎么做?再次非常感谢。这真是一种享受!!非常感谢您的时间和帮助。只为我节省了数小时/数天的转圈时间!!其实我也是awk的新手,花了2个小时来解决你的问题。只是想了解更多。有经验的人应该在开始部分的第二次OFS任务中完成,而不是在身体的状况部分。你不用“b”。如果你想使用这种方法(我不会,因为它会破坏空白,并且依赖于%%不在输入中,而是在YMMV中),完全摆脱OFS赋值,并将你的gsub()更改为
gsub(/[[:space:]+/,“;”,a[2])
。非常感谢你的回答。作为linux世界的新手,我没有足够的信心使用python。无论如何谢谢你!非常感谢你的回答。作为linux世界的新手,我没有足够的信心使用python。无论如何谢谢你!嗨,艾德,非常感谢你的回答。不幸的是,它似乎对我不起作用。这可能是因为输入文件是csv文件吗?或者可能有些空白是制表符而不仅仅是普通空格(我认为字段之间的空白可能是我的文件中的制表符和单个空格)?不,也不。最可能的问题是你在Windows上创建了文件,所以其中有虚假的控件Ms。尝试在其上运行dos2unix,然后重新运行我的脚本。若那个不起作用,那个么也许你们正在使用旧的,坏掉的awk-awk-版本告诉你们什么?嗨,再次感谢你们的时间。这个文件是在Ubuntu中创建的,它是几周前才安装的。我是linux新手,所以我还在学习!关于awk版本,我得到了“awk:notapoption:--version”,这是什么意思?您的命令是从my home/user目录运行的。再次感谢。复制/粘贴我发布的示例文件,并在其上运行我的命令,看看是否有效。如果是这样,那么问题是您的输入文件。如果没有,那么问题是你的awk。由于您的awk不支持--version,它的功能已经有问题了,所以我建议您从任何地方下载并安装GNU awk。非常感谢您的帮助,安装了gawk 4.0.1(由于手动安装有问题,最后通过ubuntu软件中心安装),现在您的命令工作正常。谢谢你的时间和耐心。嗨,艾德,非常感谢你的回答。不幸的是,它似乎对我不起作用。这可能是因为输入文件是csv文件吗?或者可能有些空白是制表符而不仅仅是普通空格(我认为字段之间的空白可能是我的文件中的制表符和单个空格)?不,也不。最可能的问题是你在Windows上创建了文件,所以其中有虚假的控件Ms。尝试在其上运行dos2unix,然后重新运行我的脚本。如果那样的话