【问题标题】:Remove first column without removing header删除第一列而不删除标题
【发布时间】:2020-04-20 00:00:33
【问题描述】:

我有一个大的制表符分隔的文本文件,如下所示:

Item Label1 Label2 Label3 
1    Pro01  cake   wine   Toy    
2    Pro02  milk   curd   butter
3    Pro03  rice   basum  white
4    Pro04  tomma  onion  root

我只想从第一列中删除内容并将其替换为第二列而不删除标题。

Item  Label1 Label2 Label3 
Pro01  cake   wine   Toy    
Pro02  milk   curd   butter
Pro03  rice   basum  white
Pro04  tomma  onion  root

【问题讨论】:

  • 如果我有超过 10000 行,解决这个问题的方法是什么?
  • 10000 行真的不是很多。有许多未优化的方法仍然会在不到 1 秒的时间内产生结果。当您的文件有几 GB 大时,则值得考虑优化版本。

标签: awk


【解决方案1】:

你只需要:

awk 'NR>1{sub(/[^\t]*\t/,"")}1' file

【讨论】:

  • 是的,但是如何在不影响标题的情况下去掉第一列。
  • @ClaesWikner 这正是我发布的脚本所做的。试试看。
  • 对我有用,与其他答案相比,我喜欢它的简短程度。 +1
  • @Claes Wikner,如果您的文件实际上不是制表符分隔的,那么我可以看到此脚本失败,因为子函数中使用的正则表达式毕竟是在寻找任何不是制表符的字符,如尽可能多次,直到它找到一个选项卡并将其替换为“”。因此,如果您只是从 OP 复制并粘贴示例,它实际上不是制表符分隔的,并且会失败。
  • Ed Morton,吹毛求疵好吧,你知道我的意思,抱歉措辞不佳。剧本很完美! :) (至少我知道正则表达式在做什么。)
【解决方案2】:

与其他解决方案类似:

awk '{print (NR>1?substr($0,1+index($0,"\t")):$0)}' file

【讨论】:

    【解决方案3】:

    正如我在评论中所说,您可以这样做:

    awk 'BEGIN{FS="\t";OFS="\t"}NR==1{print}NR>1{$1=""; print substr($0,2)}' file.txt
    

    您可能还想将输出保存到一个新文件:

    awk 'BEGIN{FS="\t";OFS="\t"}NR==1{print}NR>1{$1=""; print substr($0,2)}' file.txt > newfile.txt
    

    为了提高可读性,上面的命令是结构化的:

    awk '
    
    BEGIN {
        FS="\t";
        OFS="\t"
    }
    NR==1 {
        print
    }
    NR>1 {
        $1=""; 
        print substr($0,2)
    }' file.txt > newfile.txt
    

    【讨论】:

    • 它也会删除headder,我需要保留headder
    • 我刚刚解决了这个问题。更新后的版本也会保留标题。
    • 是的,它有效,如果我有 N 行意味着我可以如何修改这个命令
    • 我猜你的意思是说columns而不是rows,对吧?如果是这种情况,只需将更多$numbers 添加到print(每列从$1 开始编号)。如果你真的想说rows,那没关系。该命令将适用于输入文件中的所有行。
    • 是的,很抱歉行/列之间的混淆,我的首次亮相是如果我有 500 列,则无法在终端右侧输入 $2 到 $500,所以有什么办法可以解决这个问题
    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 2012-08-05
    • 2012-04-08
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多