【问题标题】:How to cut each word in a file如何剪切文件中的每个单词
【发布时间】:2015-08-18 04:52:31
【问题描述】:

是否有一个命令可以将制表符分隔的文件转换为只给出每个单词的前 4 个字母?

例如。转这个文件

Jackal Poorest Kingship Twinkle
Viscount George Lizard
Stone Goose Elephant Yvonne Chicken
Gecko Amoeba
Richard

到这个文件

Jack Poor King Twin
Visc Geor Liza
Ston Goos Elep Yvon Chic
Geck Amoe
Rich

谢谢

【问题讨论】:

  • 你想用哪种语言编写代码?
  • Unix 或 perl (one-liner) 最好。
  • 我尝试了不同的剪切语法,我似乎只能分成几列,分别剪切 c1-4 并粘贴,但这非常低效

标签: regex perl unix cut


【解决方案1】:

使用substr 修剪每个单词。将以下名称命名为trim.pl

#!/usr/bin/env perl

use strict;
use warnings;

while (<>) {
    chomp;
    my @words = split /\s+/;
    my @trim;
    for my $word (@words) {
        push @trim, substr($word,0,4);
    }
    print join ' ', @trim;
    print "\n";
}

运行如下:

cat names.txt | trim.pl

哪些输出:

Jack Poor King Twin
Visc Geor Liza
Ston Goos Elep Yvon Chic
Geck Amoe
Rich

【讨论】:

    【解决方案2】:

    尝试这种模式匹配足以做到这一点

    while(<DATA>)
    {
    (@ar) = $_ =~m/(.{4}).+?\s/g;
    print "@ar\n";
    }
    __DATA__
    Jackal Poorest Kingship Twinkle
    Viscount George Lizard
    Stone Goose Elephant Yvonne Chicken
    Gecko Amoeba
    Richard
    
    output
    Jack Poor King Twin
    Visc Geor Liza
    Ston Goos Elep Yvon Chic
    Geck Amoe
    Rich
    

    【讨论】:

      【解决方案3】:
      perl -lane '$,=" "; print map substr($_,0,4),@F' input
      

      【讨论】:

      • 对代码进行一些解释会使其成为更好的答案。
      • 是的,但它也会从读者那里偷走弄清楚它的乐趣!
      • 好吧,解释应该足够短以引起兴趣,并且足够长以涵盖主题;像一条裙子:)
      【解决方案4】:

      命令行中的 Perl,

      perl -anE 'say join " ", map /(.{1,4})/, @F' file.txt
      

      use feature 'say';
      
      while (my $line = <>) {
        my @F = split ' ', $line;
        say join " ", map /(.{1,4})/, @F; 
      }
      

      【讨论】:

        【解决方案5】:

        更易读的 awk 版本

        awk '{l=sep=""; for(i=1;i<=NF;i++){l = l sep substr($i,1,4); sep=FS}; print l}'
        

        【讨论】:

        • 没有任何解释和用L命名变量,我不会称之为可读的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-13
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多