将文本转换为表格(以空格分隔或固定长度)

时间:2019-11-24 07:00:44

标签: excel text awk sed cmd

我有一个带有制表符分隔数据(150行)的文本文件,我想将其转换为以空格分隔或固定长度的列。我试图使用Excel的 .prn 格式导出文件,但是在MS Notepad中打开时,它将丢失所有格式。

让我们考虑该文件为:

Product Name    Product Key
Autodesk 3ds Max 2019   128K1
Autodesk 3ds Max 2019 with Softimage    978K1
Autodesk Advance Steel 2019 959K1
Autodesk Alias AutoStudio 2019  966K1
Autodesk Alias Concept 2019 A63K1
Autodesk Alias Design 2019  712K1
Autodesk Alias SpeedForm 2019   A62K1
Autodesk Alias Surface 2019 736K1
Autodesk AutoCAD 2019   001K1

现在需要的是

       Product Name                  Product Key
Autodesk 3ds Max 2019                   128K1
Autodesk 3ds Max 2019 with Softimage    978K1
Autodesk Advance Steel 2019             959K1
Autodesk Alias AutoStudio 2019          966K1
Autodesk Alias Concept 2019             A63K1
Autodesk Alias Design 2019              712K1
Autodesk Alias SpeedForm 2019           A62K1
Autodesk Alias Surface 2019             736K1
Autodesk AutoCAD 2019                   001K1

我使用过this工具,它可以完成工作,但是再次保存在MS记事本中时,列被错误处理,我只希望数据在记事本中...

  

P.S。。是否可以使用任何可用于   记事本.. EXCELCMDSHELL 。我喜欢码头。?

预先感谢...!

4 个答案:

答案 0 :(得分:3)

请您尝试以下。

awk '
FNR==NR{
  len=length($0)>len?length($0):len
  next
}
{
  val=$NF
  $NF=""
  $1=$1
  printf("%-"len"s%s\n",$0,val)
}
'  Input_file  Input_file

一种内衬形式的解决方案:

awk 'FNR==NR{len=length($0)>len?length($0):len;next}  {val=$NF;$NF="";$1=$1;printf("%-"len"s%s\n",$0,val)}'  Input_file  Input_file

说明: :添加了上述代码的说明。

awk '                                       ##Starting awk program from here.
FNR==NR{                                    ##Checking condition FNR==NR which will be TRUE when first time Input_file is being read.
  len=length($0)>len?length($0):len         ##Creating variable len whose value is either length of current line or len value whichever is having higher value.
  next                                      ##next will skip all further statements from here.
}                                           ##Closing BLOCK for FNR==NR condition here.
{                                           ##Starting BLOCK which will be executed when 2nd time Input_file is being read.
  val=$NF                                   ##Creating variable val whose value is $NF(last field of current line).
  $NF=""                                    ##Nullifying last field of current line.
  $1=$1                                     ##re-assigning value of $1 to itself to adjust $0.
  printf("%-"len"s %s\n",$0,val)            ##Printing current line with mentioning %- with variable len to add spaces at last of current line and then printing last field with new line.
}                                           ##Closing BLOCK for which was opened for 2nd time Input_file is being read.
'  Input_file  Input_file                   ##Mentioning Input_file names here.

输出如下。

Product Name Product                         Key
Autodesk 3ds Max 2019                        128K1
Autodesk 3ds Max 2019 with Softimage         978K1
Autodesk Advance Steel 2019                  959K1
Autodesk Alias AutoStudio 2019               966K1
Autodesk Alias Concept 2019                  A63K1
Autodesk Alias Design 2019                   712K1
Autodesk Alias SpeedForm 2019                A62K1
Autodesk Alias Surface 2019                  736K1
Autodesk AutoCAD 2019                        001K1

对于Windows用户:

如果已安装Windows Subsystem for Linux,则可以直接执行awk脚本 如上文bash命令行中所述。
如果您已经安装(或将要安装)gawk 作为独立的应用程序软件,请遵循以下指南:

  • 首先从诸如sourceforge之类的适当服务器上下载Gawk for Windows。 那里有两个 安装类型: with 安装程序或 without 安装程序。这个选择由你。 以下描述基于没有安装程序的情况。

  • 解压缩下载的文件以在任意位置提取二进制文件和模块。 (下载 文件夹,桌面或其他任何位置)。

  • 在桌面上或任何位置创建具有任意名称(例如“ myawk”)的工作文件夹 方便。

  • 将下面的脚本复制到具有任意名称(例如“ script.txt”)的文件中。
    作为awk可执行文件 不关心脚本文件的扩展名,可以将其与“ .txt”关联 文本编辑器,也可以更改为“ .awk”进行规范。

    FNR==NR{
      len=length($0)>len?length($0):len
      next
    }
    {
      val=$NF
      $NF=""
      $1=$1
      printf("%-"len"s%s\n",$0,val)
    }
    
  • 打开一个cmd终端,然后chdir到上面创建的工作文件夹中。

  • 然后在终端上键入以下内容:

    C:\your\path\to\gawk.exe -f script.txt Input_file.txt Input_file.txt > Output_file.txt
    

    请根据您的系统修改字符串“ C:\ yout \ path \ to \ gawk.exe”。
    如果您已经安装gawk 安装程序,或者已将-path-to-gawk-executable附加到 环境变量PATH,您可以输入:

    gawk.exe -f script.txt Input_file.txt Input_file.txt > Output_file.txt
    
  • 您可以在Output_file.txt中找到结果。请确保您使用的是等宽字体 显示垂直对齐的列。

尽管自awkgawk诞生以来已经过去了很长时间,但它仍然不算过时。 请喜欢骇客awk,以提高工作效率和生产力。

答案 1 :(得分:1)

perl版本(由于听起来您正在使用Windows,因此如果您还没有perl,请安装Strawberry Perl):

#!/usr/bin/env perl
# Save in a file instead of trying to use as a one-liner
use warnings;
use strict;
use autodie;
use List::Util qw/max/;
use Fcntl qw/:seek/;

my $file = shift;
open my $INFILE, "<", $file;

my @lens;
while (<$INFILE>) {
  chomp;
  my @F = split /\t/;
  for my $col (0 .. $#F) {
    $lens[$col] = max(length $F[$col], $lens[$col]//0);
  }
}

seek $INFILE, 0, SEEK_SET;

while (<$INFILE>) {
  chomp;
  my @F = split /\t/;
  for my $col (0 .. $#F) {
    printf "%-*s ", $lens[$col], $F[$col];
  }
  print "\n";
}

示例:

$ perl widify input.tsv
 Product Name                         Product Key 
 Autodesk 3ds Max 2019                128K1       
 Autodesk 3ds Max 2019 with Softimage 978K1       
 Autodesk Advance Steel 2019          959K1       
 Autodesk Alias AutoStudio 2019       966K1       
 Autodesk Alias Concept 2019          A63K1       
 Autodesk Alias Design 2019           712K1       
 Autodesk Alias SpeedForm 2019        A62K1       
 Autodesk Alias Surface 2019          736K1       
 Autodesk AutoCAD 2019                001K1

答案 2 :(得分:1)

这可能对您有用(GNU sed):

sed -E '1{s/\S+ \S+/       &              /;b};:a;/^.{39,} \S+$/!s/^(.*) /\1  /;ta' file

标题位于列的上方,其余各行的第一个字段在右侧用空格填充,因此将其设置为40个字符的宽度。

答案 3 :(得分:1)

PowerShell可用于UNIX / Linux系统,Mac和Windows。 https://github.com/PowerShell/PowerShell

PS 13:38  C:\src\t
C:>type ./tsv2fixed.ps1
Import-Csv -Path 'tsv2fixed.txt' -Delimiter "`t" |
    ForEach-Object {
        "{0,-40}{1}" -f @($_.'Product Name', $_.'Product Key')
    } |
    Out-File -FilePath './tsv2fixed-out.txt' -Encoding ascii
PS 13:38  C:\src\t
C:>./tsv2fixed.ps1
PS 13:38  C:\src\t
C:>type ./tsv2fixed-out.txt
Autodesk 3ds Max 2019                   128K1
Autodesk 3ds Max 2019 with Softimage    978K1
Autodesk Advance Steel 2019             959K1
Autodesk Alias AutoStudio 2019          966K1
Autodesk Alias Concept 2019             A63K1
Autodesk Alias Design 2019              712K1
Autodesk Alias SpeedForm 2019           A62K1
Autodesk Alias Surface 2019             736K1
Autodesk AutoCAD 2019                   001K1