Unix命令将特定COLUMNS的文本从3个文件复制到第四个文件中的特定COLUMNS

时间:2014-07-15 18:20:59

标签: bash awk sed cut

我有3个文件,我想将每个文件的特定COLUMNS复制到另一个第四个文件中的不同COLUMNS中。 这有点棘手,如果可能请跟我来。

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。我能够复制文本,而不是复制到所需的COLUMNS。

粘贴-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

3 个答案:

答案 0 :(得分:2)

使用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列表中设置变量,那么所有这些都留作练习或更好 - 得到呆子!

答案 1 :(得分:0)

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

我没有得到你想要的列的顺序,所以我将举例说明它是如何工作的。

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

File1中:

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,

file2的:

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,

file3:

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。

答案 2 :(得分:-1)

制作如下文件(例如spfunconfig),其中行号(文件中实际不存在)将是file4中的行号。所以下面的示例将读取文件4中的1行来自文件中的1行。文件4中的行来自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