AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1230044
Accepted
Mohamed Abdelaal
Mohamed Abdelaal
Asked: 2020-04-24 17:58:38 +0800 CST2020-04-24 17:58:38 +0800 CST 2020-04-24 17:58:38 +0800 CST

复制粘贴后如何对齐文本文件?

  • 772

我将文件 1 中的第 7,8 列和第 9 列复制到文件 2 中的第 7,8 列和第 9 列中,生成了一个新文件 3。生成的文件(文件 3)未与原始文件对齐,如何编辑它以保留结盟 ?

我使用了命令:

    awk '(getline line < "file 1") > -1 {split(line,a); $7 = a[7]; $8 = a[8]; $9= a[9]} 1' file 2 > file 3

文件 1:

真空中的 GRM

192700

1GRM     C1    1  17.188   0.311  13.994 -0.5971  0.0204 -0.0724
1GRM     C2    2   0.094   0.383   0.005  0.4831 -0.8709 -0.2204
1GRM     C3    3   0.091   0.524   0.008 -0.7098  0.3449 -0.3952
1GRM     C4    4  17.185   0.596   0.007 -0.4066 -0.4079  0.1701
2GRM     C1    5  17.187   0.738   0.016  0.1844 -0.5441 -0.4893
2GRM     C2    6   0.090   0.815   0.011  1.1631 -0.2289 -0.8340
2GRM     C3    7   0.091   0.957   0.014 -0.4473 -0.2423 -0.3223
2GRM     C4    8  17.184   1.028   0.009 -0.4822  0.0086 -0.4791
3GRM     C1    9  17.189   1.171   0.004 -0.0345 -0.8207 -0.6602 

文件 2:

真空中的 GRM

192760

1GRM     C1    1   0.061   0.071  14.000 
1GRM     C2    2   0.184   0.142  14.000
1GRM     C3    3   0.184   0.284   0.000
1GRM     C4    4   0.061   0.355   0.000
2GRM     C1    5   0.061   0.497  14.000
2GRM     C2    6   0.184   0.568   0.000
2GRM     C3    7   0.184   0.710   0.000
2GRM     C4    8   0.061   0.781   0.000
3GRM     C1    9   0.061   0.923   0.000
3GRM     C2   10   0.184   0.994  14.000
3GRM     C3   11   0.184   1.136  14.000
3GRM     C4   12   0.061   1.207  14.000
4GRM     C1   13   0.061   1.349  14.000
4GRM     C2   14   0.184   1.420  14.000
4GRM     C3   15   0.184   1.562   0.000
4GRM     C4   16   0.061   1.633  14.000
5GRM     C1   17   0.061   1.775   0.000
5GRM     C2   18   0.184   1.846   0.002
5GRM     C3   19   0.184   1.988   0.001
5GRM     C4   20   0.061   2.059   0.000

文件 3:

真空中的 GRM

192760

1GRM C1 1 0.061 0.071 14.000 -0.5971 0.0204 -0.0724
1GRM C2 2 0.184 0.142 14.000 0.4831 -0.8709 -0.2204
1GRM C3 3 0.184 0.284 0.000 -0.7098 0.3449 -0.3952
1GRM C4 4 0.061 0.355 0.000 -0.4066 -0.4079 0.1701
2GRM C1 5 0.061 0.497 14.000 0.1844 -0.5441 -0.4893
2GRM C2 6 0.184 0.568 0.000 1.1631 -0.2289 -0.8340
2GRM C3 7 0.184 0.710 0.000 -0.4473 -0.2423 -0.3223
2GRM C4 8 0.061 0.781 0.000 -0.4822 0.0086 -0.4791
3GRM C1 9 0.061 0.923 0.000 -0.0345 -0.8207 -0.6602
3GRM C2 10 0.184 0.994 14.000 0.1033 0.4238 -0.8983
3GRM C3 11 0.184 1.136 14.000 -0.0426 -0.1083 -0.8554
3GRM C4 12 0.061 1.207 14.000 -0.2814 -0.0363 -0.9146
4GRM C1 13 0.061 1.349 14.000 0.7722 0.4317 -0.4379
4GRM C2 14 0.184 1.420 14.000 -0.5701 0.2915 -0.3098
4GRM C3 15 0.184 1.562 0.000 0.4572 0.1368 0.1921
4GRM C4 16 0.061 1.633 14.000 -0.0747 -0.5492 -0.1254
5GRM C1 17 0.061 1.775 0.000 0.3071 0.9864 -0.8679
5GRM C2 18 0.184 1.846 0.002 -0.7815 -0.8144 -0.0069
5GRM C3 19 0.184 1.988 0.001 -0.0089 0.1174 0.2548
5GRM C4 20 0.061 2.059 0.000 0.7953 0.1404 -1.1225
6GRM C1 21 0.061 2.201 14.000 -0.0370 0.1705 -0.3342
6GRM C2 22 0.184 2.272 14.000 -0.2619 0.4221 -0.6572
6GRM C3 23 0.184 2.414 14.000 -0.4540 -0.3948 -0.6204
6GRM C4 24 0.061 2.485 14.000 -0.1499 -0.2942 -0.5181

我想要的格式与文件 1 和 2 的格式相同(列之间的空格)

我按照 schrodigerscatcuriosity 和 steeldriver 的建议尝试了以下命令,但是从第 10002 行到最后我仍然有问题,请检查下面我尝试的命令和输出:

    awk '(getline line < "file_1") > -1 {split(line,a); $7 = a[7]; $8 = a[8]; $9= a[9]} 1' file_2 | rev | column -t | rev > file_3

    awk 'BEGIN{fmt="%8s%7s%5d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f"} (getline line < "file 1") > -1 {n = split(line,a)} n > 6 {$0 = sprintf(fmt,$1,$2,$3,$4,$5,$6,a[7],a[8],a[9])} 1' "file 2" > file 3

他们都给了我以下信息:

 2499GRM     C2 9994  15.433   7.810   0.001  0.2740 -0.1307  0.2597
 2499GRM     C3 9995  15.433   7.952   0.000 -0.0604 -0.1317  0.2130
 2499GRM     C4 9996  15.310   8.023   0.001 -0.0362 -0.0640 -0.3092
 2500GRM     C1 9997  15.310   8.165   0.001 -0.0183 -0.0765 -0.0458
 2500GRM     C2 9998  15.433   8.236   0.000 -0.2414  0.3310  0.3241
 2500GRM     C3 9999  15.433   8.378   0.000 -0.2669  0.3179  0.8367
 2500GRMC410000   15   8.449   0.000   0.000  0.5860  0.8426  0.0000 #(This line is 10002)
 2501GRMC110001   15   8.591   0.000   0.000  0.5939 -0.1623  0.0000
 2501GRMC210002   15   8.662   0.000   0.000  0.4561 -0.1660  0.0000

我试图增加空间使用

 awk 'BEGIN{fmt="%10s%9s%7d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f"} (getline line < "file 1") > -1 {n = split(line,a)} n > 6 {$0 = sprintf(fmt,$1,$2,$3,$4,$5,$6,a[7],a[8],a[9])} 1' "file 2" > file 3

按照 的建议,我得到了以下输出:

   2499GRM       C3   9995  15.433   7.952   0.000 -0.0604 -0.1317  0.2130
   2499GRM       C4   9996  15.310   8.023   0.001 -0.0362 -0.0640 -0.3092
   2500GRM       C1   9997  15.310   8.165   0.001 -0.0183 -0.0765 -0.0458
   2500GRM       C2   9998  15.433   8.236   0.000 -0.2414  0.3310  0.3241
   2500GRM       C3   9999  15.433   8.378   0.000 -0.2669  0.3179  0.8367
   2500GRM  C410000     15   8.449   0.000   0.000  0.5860  0.8426  0.0000 # (This line is 10002)
   2501GRM  C110001     15   8.591   0.000   0.000  0.5939 -0.1623  0.0000
   2501GRM  C210002     15   8.662   0.000   0.000  0.4561 -0.1660  0.0000
   2501GRM  C310003     15   8.804   0.000   0.000  0.4524 -0.1486  0.0000
   2501GRM  C410004     15   8.875   0.000   0.000 -0.2143  0.4926  0.0000
   2502GRM  C110005     15   9.017   0.000   0.000 -0.2203  0.2975  0.0000
   2502GRM  C210006     15   9.088   0.000   0.000 -0.2375 -0.0458  0.0000
   2502GRM  C310007     15   9.230  14.000   0.000 -0.2338 -0.4862  0.0000
   2502GRM  C410008     15   9.301  14.000   0.000 -0.1438 -0.0725  0.0000

原始文件在同一部分(第 10002 行)如下所示:

文件 1:

 2499GRM     C3 9995  15.167   8.231  13.994 -0.0604 -0.1317  0.2130
 2499GRM     C4 9996  15.045   8.304  13.996 -0.0362 -0.0640 -0.3092
 2500GRM     C1 9997  15.046   8.446   0.001 -0.0183 -0.0765 -0.0458
 2500GRM     C2 9998  15.170   8.516  13.999 -0.2414  0.3310  0.3241
 2500GRM     C3 9999  15.172   8.658   0.003 -0.2669  0.3179  0.8367
 2500GRM     C410000  15.049   8.727   0.006 -0.1138  0.5860  0.8426 #(line 10002)
 2501GRM     C110001  15.048   8.869   0.006 -0.0660  0.5939 -0.1623
 2501GRM     C210002  15.171   8.940   0.006  0.0179  0.4561 -0.1660
 2501GRM     C310003  15.173   9.082   0.005  0.3025  0.4524 -0.1486

文件 2:

 2499GRM     C3 9995  15.433   7.952   0.000
 2499GRM     C4 9996  15.310   8.023   0.001
 2500GRM     C1 9997  15.310   8.165   0.001
 2500GRM     C2 9998  15.433   8.236   0.000
 2500GRM     C3 9999  15.433   8.378   0.000
 2500GRM     C410000  15.310   8.449   0.000     #(This line is 10002)
 2501GRM     C110001  15.310   8.591   0.000
 2501GRM     C210002  15.433   8.662   0.000
 2501GRM     C310003  15.433   8.804   0.000
 2501GRM     C410004  15.310   8.875   0.000

值得一提的是,问题发生在第 10002 行

command-line bash text-processing awk copy-and-paste
  • 4 4 个回答
  • 309 Views

4 个回答

  • Voted
  1. schrodingerscatcuriosity
    2020-04-24T18:17:22+08:002020-04-24T18:17:22+08:00

    你可以试试这个技巧:

    awk '(getline line < "file_1") > -1 {split(line,a); $7 = a[7]; $8 = a[8]; $9= a[9]} 1' file_2 | rev | column -t | rev > file_3
    

    输出:

    1GRM  C1   1  0.061  0.071  14.000  -0.5971   0.0204  -0.0724
    1GRM  C2   2  0.184  0.142  14.000   0.4831  -0.8709  -0.2204
    1GRM  C3   3  0.184  0.284   0.000  -0.7098   0.3449  -0.3952
    1GRM  C4   4  0.061  0.355   0.000  -0.4066  -0.4079   0.1701
    2GRM  C1   5  0.061  0.497  14.000   0.1844  -0.5441  -0.4893
    2GRM  C2   6  0.184  0.568   0.000   1.1631  -0.2289  -0.8340
    2GRM  C3   7  0.184  0.710   0.000  -0.4473  -0.2423  -0.3223
    2GRM  C4   8  0.061  0.781   0.000  -0.4822   0.0086  -0.4791
    3GRM  C1   9  0.061  0.923   0.000  -0.0345  -0.8207  -0.6602
    3GRM  C2  10  0.184  0.994  14.000  -0.0345  -0.8207  -0.6602
    3GRM  C3  11  0.184  1.136  14.000  -0.0345  -0.8207  -0.6602
    3GRM  C4  12  0.061  1.207  14.000  -0.0345  -0.8207  -0.6602
    4GRM  C1  13  0.061  1.349  14.000  -0.0345  -0.8207  -0.6602
    4GRM  C2  14  0.184  1.420  14.000  -0.0345  -0.8207  -0.6602
    4GRM  C3  15  0.184  1.562   0.000  -0.0345  -0.8207  -0.6602
    4GRM  C4  16  0.061  1.633  14.000  -0.0345  -0.8207  -0.6602
    5GRM  C1  17  0.061  1.775   0.000  -0.0345  -0.8207  -0.6602
    5GRM  C2  18  0.184  1.846   0.002  -0.0345  -0.8207  -0.6602
    5GRM  C3  19  0.184  1.988   0.001  -0.0345  -0.8207  -0.6602
    5GRM  C4  20  0.061  2.059   0.000  -0.0345  -0.8207  -0.6602
    
    • 2
  2. steeldriver
    2020-04-24T19:02:46+08:002020-04-24T19:02:46+08:00

    如果您需要严格对齐,您可能需要考虑使用显式格式printf或sprintf语句 ex。

    $ awk '
        BEGIN{fmt="%8s%7s%5d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f"} 
        (getline line < "file 1") > -1 {n = split(line,a)} 
        n > 6 {$0 = sprintf(fmt, $1,$2,$3,$4,$5,$6,a[7],a[8],a[9])}
        1
      ' "file 2"
    GRM in vacuum
    
    192760
    
        1GRM     C1    1   0.061   0.071  14.000 -0.5971  0.0204 -0.0724
        1GRM     C2    2   0.184   0.142  14.000  0.4831 -0.8709 -0.2204
        1GRM     C3    3   0.184   0.284   0.000 -0.7098  0.3449 -0.3952
        1GRM     C4    4   0.061   0.355   0.000 -0.4066 -0.4079  0.1701
        2GRM     C1    5   0.061   0.497  14.000  0.1844 -0.5441 -0.4893
        2GRM     C2    6   0.184   0.568   0.000  1.1631 -0.2289 -0.8340
        2GRM     C3    7   0.184   0.710   0.000 -0.4473 -0.2423 -0.3223
        2GRM     C4    8   0.061   0.781   0.000 -0.4822  0.0086 -0.4791
        3GRM     C1    9   0.061   0.923   0.000 -0.0345 -0.8207 -0.6602
        3GRM     C2   10   0.184   0.994  14.000 -0.0345 -0.8207 -0.6602
        3GRM     C3   11   0.184   1.136  14.000 -0.0345 -0.8207 -0.6602
        3GRM     C4   12   0.061   1.207  14.000 -0.0345 -0.8207 -0.6602
        4GRM     C1   13   0.061   1.349  14.000 -0.0345 -0.8207 -0.6602
        4GRM     C2   14   0.184   1.420  14.000 -0.0345 -0.8207 -0.6602
        4GRM     C3   15   0.184   1.562   0.000 -0.0345 -0.8207 -0.6602
        4GRM     C4   16   0.061   1.633  14.000 -0.0345 -0.8207 -0.6602
        5GRM     C1   17   0.061   1.775   0.000 -0.0345 -0.8207 -0.6602
        5GRM     C2   18   0.184   1.846   0.002 -0.0345 -0.8207 -0.6602
        5GRM     C3   19   0.184   1.988   0.001 -0.0345 -0.8207 -0.6602
        5GRM     C4   20   0.061   2.059   0.000 -0.0345 -0.8207 -0.6602
    
    • 2
  3. Raffa
    2020-04-26T13:27:51+08:002020-04-26T13:27:51+08:00

    除了Steeldriver和schrodigerscatcuriosity已经给出的两个很好的答案

    试试这个(为了便于阅读,这是一个分成四行的命令,只需一次将所有四行都粘贴到终端中,然后按Enter),看看它是否适合你:

    awk '(getline line < "file1") > -1 {split(line,a); l=length($2); \
    if (l>2) {$2=substr($2,1,2) OFS substr($2,3)}; \
    if (l>2) {$7 = a[6]; $8 = a[7]; $9= a[8]} else \
    {$7 = a[7]; $8 = a[8]; $9= a[9]}}1' "file2" | column -t > "file3"
    

    更改您file1的file2输入文件,输出将保存到file3


    注意:

    您的列数在第 10002 行发生变化(第 2 列和第 3 列变为一列),命令的以下部分修复了此问题:

    l=length($2); \
    if (l>2) {$2=substr($2,1,2) OFS substr($2,3)}; \
    if (l>2) {$7 = a[6]; $8 = a[7]; $9= a[8]} else \
    {$7 = a[7]; $8 = a[8]; $9= a[9]}
    
    • 2
  4. Best Answer
    Mohamed Abdelaal
    2020-05-03T13:04:12+08:002020-05-03T13:04:12+08:00

    Freddy 在 Stack Exchange - Unix & Linux 中回答了这个问题。我只是发布答案,以防其他人遇到同样的问题。

    问题是您在 file1 中有 8 个或 9 个数据字段,而在 file2 中有 5 个或 6 个数据字段。C3 9999 是一个格式错误的字段,或者 C410000 应该是两个字段 C4 和 10000。

    要根据字段数调整格式,您可以

    使用两个格式字符串并在它们之间切换保存数组元素的数量 n 分割行并取最后三个值 a[n-2]、a[n-1]、a[n]

    awk '
    BEGIN{
    fmt1="%8s %6s%5s %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f" ORS
    fmt2="%8s %11s %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f" ORS
    }
    (getline line < "file 1") > -1{
    n=split(line, a)
    }
    NF<=3{ print; next }                                                     # 
    print original line 
    NF==6{ printf fmt1, $1, $2, $3, $4, $5, $6, a[n-2], a[n-1], a[n]; next } # 6 + 
    3 fields
    { printf fmt2, $1, $2, $3, $4, $5, a[n-2], a[n-1], a[n] }                # 5 + 
    3 fields
    ' "file 2" > "file 3"
    
    • 0

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve