【问题标题】:Unix command to copy text a specific COLUMNS from 3 files to a specific COLUMNS in a fourth fileUnix命令将文本从3个文件中的特定列复制到第四个文件中的特定列
【发布时间】:2014-09-06 01:47:09
【问题描述】:

我有 3 个文件,我想将每个文件的特定列复制到另一个第四个文件的不同列中。 这有点棘手,所以如果可能的话,请关注我。

File 1 copy COLUMNS 1,2,3,4,5 to COLUMNS 6,10,12,13,20 file 4 
File 2 copy COLUMNS 1,2,3,4,5 to COLUMNS 4,24,25,26,27 file 4
File 3 copy COLUMNS 1-9 to COLUMNS 1-3 and 14-19 to file 4

我尝试了几种不同的方法,即 sed、cut、join、paste 和 awk。我可以复制文本,但不能复制到所需的列。

粘贴 -d ',' file1.csv file2.csv file3.csv | sed 's/\r//g' | cut -d ',' -f 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 | sed 's/$/\r/' >>file4.csv

【问题讨论】:

  • 你是指行还是列/字段?
  • 所以我的回答应该适合你;)
  • 是的,我的意思是说 COLUMN。对困惑感到抱歉。我正在尝试将 3 个文件的特定列复制到第四个文件中的特定列。示例:文件 1 的第 1、2、3、4 列到文件 4 中的第 8、5、6、7 列 文件 2 的第 1、2、3、4 列到文件 4 中的第 28、25、26、27 列 第 1、2、3 列文件 3 的 ,4 到文件 4 中的第 18、15、16、17 列

标签: bash awk sed cut


【解决方案1】:

将 GNU awk 用于 ARGIND:

awk -v OFS='\n' '
{ a[ARGIND,FNR] = $0 }
END { print a[3,1],a[3,2],a[3,3],a[2,1],a[3,4],a[1,1],... }
' file1 file2 file3 > file4

鉴于您对列(字段)而不是行(记录/行)的要求的更改,并假设您的文件包含逗号分隔的字段,正如您在问题中发布的 paste 命令所暗示的那样,再次将 GNU awk 用于 ARGIND :

$ cat tst.awk
BEGIN { FS=OFS="," }
ARGIND < 3 { for (i=1;i<=NF;i++) a[ARGIND,i]=$i; next }
{ print $1, $2, a[1,3], a[1,4], a[2,5], a[2,6], $7, $8, a[1,9] }

$ cat file1
a,b,c,d,e,f,g,h,i

$ cat file2
1,2,3,4,5,6,7,8,9

$ cat file3
A,B,C,D,E,F,G,H,I

$ awk -f tst.awk file1 file2 file3
A,B,c,d,5,6,G,H,i

如果您的 awk 不提供 ARGIND,您只需添加以下内容即可绕过它:

FNR == 1 { ++ARGIND }

如果您从来没有空文件。如果您确实有空文件,那么您需要:

FNR == 1 { for (i=1;i in ARGV;i++) if (ARGV[i] == FILENAME) ARGIND = i }

如果您从来没有重复相同的文件名。如果你可以有空文件和重复的文件名,那么你需要为每个文件名添加一个计数器数组,如果你可以在 arg 列表中设置变量,那么所有这些都留作练习或更好 - 得到傻眼!

【讨论】:

  • 我的意思是说 COLUMN。对困惑感到抱歉。我正在尝试将 3 个文件的特定列复制到第四个文件中的特定列。示例:文件 1 的第 1、2、3、4 列到文件 4 中的第 8、5、6、7 列 文件 2 的第 1、2、3、4 列到文件 4 中的第 28、25、26、27 列 第 1、2、3 列文件 3 的 ,4 到文件 4 中的第 18、15、16、17 列
  • 我刚刚更新了我的答案以适用于列而不是行。
【解决方案2】:

如果我理解你的话,你的意思是字段而不是行,如果是这样,请检查 ftable here

我没有完全了解您想要的列的顺序,所以我将举例说明它是如何工作的。

假设我们有一个 3 文件,看起来像:

文件1:

F1_A1,F1_B1,F1_C1,F1_D1,F1_E1,
F1_A2,F1_B2,F1_C2,F1_D2,F1_E2,
F1_A3,F1_B3,F1_C3,F1_D3,F1_E3,
F1_A4,F1_B4,F1_C4,F1_D4,F1_E4,
F1_A5,F1_B5,F1_C5,F1_D5,F1_E5,
F1_A6,F1_B6,F1_C6,F1_D6,F1_E6,
F1_A7,F1_B7,F1_C7,F1_D7,F1_E7,
F1_A8,F1_B8,F1_C8,F1_D8,F1_E8,
F1_A9,F1_B9,F1_C9,F1_D9,F1_E9,
F1_A10,F1_B10,F1_C10,F1_D10,F1_E10,

文件2:

F2_A1,F2_B1,F2_C1,F2_D1,F2_E1,
F2_A2,F2_B2,F2_C2,F2_D2,F2_E2,
F2_A3,F2_B3,F2_C3,F2_D3,F2_E3,
F2_A4,F2_B4,F2_C4,F2_D4,F2_E4,
F2_A5,F2_B5,F2_C5,F2_D5,F2_E5,
F2_A6,F2_B6,F2_C6,F2_D6,F2_E6,
F2_A7,F2_B7,F2_C7,F2_D7,F2_E7,
F2_A8,F2_B8,F2_C8,F2_D8,F2_E8,
F2_A9,F2_B9,F2_C9,F2_D9,F2_E9,
F2_A10,F2_B10,F2_C10,F2_D10,F2_E10,

文件3:

F3_A1,F3_B1,F3_C1,F3_D1,F3_E1,
F3_A2,F3_B2,F3_C2,F3_D2,F3_E2,
F3_A3,F3_B3,F3_C3,F3_D3,F3_E3,
F3_A4,F3_B4,F3_C4,F3_D4,F3_E4,
F3_A5,F3_B5,F3_C5,F3_D5,F3_E5,
F3_A6,F3_B6,F3_C6,F3_D6,F3_E6,
F3_A7,F3_B7,F3_C7,F3_D7,F3_E7,
F3_A8,F3_B8,F3_C8,F3_D8,F3_E8,
F3_A9,F3_B9,F3_C9,F3_D9,F3_E9,
F3_A10,F3_B10,F3_C10,F3_D10,F3_E10,

我们希望 file4 具有以下映射:

field 1     = File1(field 1)
field 2     = File2(field 1)
field 3     = File3(field 1)
field 4-7   = File1(field 2-5)
field 8-11  = File2(field 2-5)
filed 12-15 = File3(field 2-5)

我们将所有 3 个文件粘贴在一起,然后使用 ftable 选择您想要的字段:

paste  file1 file2 file3   | ftable  -n -p 1,6,11,2-5,7-10,12-15
  F1_A1   F2_A1   F3_A1   F1_B1   F1_C1   F1_D1   F1_E1   F2_B1   F2_C1   F2_D1   F2_E1   F3_B1   F3_C1   F3_D1   F3_E1 
  F1_A2   F2_A2   F3_A2   F1_B2   F1_C2   F1_D2   F1_E2   F2_B2   F2_C2   F2_D2   F2_E2   F3_B2   F3_C2   F3_D2   F3_E2 
  F1_A3   F2_A3   F3_A3   F1_B3   F1_C3   F1_D3   F1_E3   F2_B3   F2_C3   F2_D3   F2_E3   F3_B3   F3_C3   F3_D3   F3_E3 
  F1_A4   F2_A4   F3_A4   F1_B4   F1_C4   F1_D4   F1_E4   F2_B4   F2_C4   F2_D4   F2_E4   F3_B4   F3_C4   F3_D4   F3_E4 
  F1_A5   F2_A5   F3_A5   F1_B5   F1_C5   F1_D5   F1_E5   F2_B5   F2_C5   F2_D5   F2_E5   F3_B5   F3_C5   F3_D5   F3_E5 
  F1_A6   F2_A6   F3_A6   F1_B6   F1_C6   F1_D6   F1_E6   F2_B6   F2_C6   F2_D6   F2_E6   F3_B6   F3_C6   F3_D6   F3_E6 
  F1_A7   F2_A7   F3_A7   F1_B7   F1_C7   F1_D7   F1_E7   F2_B7   F2_C7   F2_D7   F2_E7   F3_B7   F3_C7   F3_D7   F3_E7 
  F1_A8   F2_A8   F3_A8   F1_B8   F1_C8   F1_D8   F1_E8   F2_B8   F2_C8   F2_D8   F2_E8   F3_B8   F3_C8   F3_D8   F3_E8 
  F1_A9   F2_A9   F3_A9   F1_B9   F1_C9   F1_D9   F1_E9   F2_B9   F2_C9   F2_D9   F2_E9   F3_B9   F3_C9   F3_D9   F3_E9 
 F1_A10  F2_A10  F3_A10  F1_B10  F1_C10  F1_D10  F1_E10  F2_B10  F2_C10  F2_D10  F2_E10  F3_B10  F3_C10  F3_D10  F3_E10 

免责声明:我写了 ftable。

【讨论】:

    【解决方案3】:

    制作一个像下面这样的文件(比如 spfunconfig),其中行号(实际上并不存在于文件中)将是文件中的行号4。因此下面的示例将读取为文件 4 中的 1 行来自文件 3.2 中的 1 行 file4 中的第 2 行来自 file3 的第 2 行

    1 file3
    2 file3
    3 file3
    1 file2
    5 file3
    ...
    ...
    

    代码:

    spfun(){more "$2"|head -"$1"|tail -1>>file4;}
    for i in `seq 1 1 27`
    do
    more spfunconfig|head -"$i"|tail -1>temp
    spfun $a $b < temp
    done
    

    【讨论】:

      猜你喜欢
      • 2019-05-27
      • 2020-03-02
      • 2013-08-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 2016-06-07
      相关资源
      最近更新 更多