我有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
答案 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