csv 从一个文件中复制3列并粘贴到另一个文件的开头[关闭]

alen0pnh  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(88)

已关闭,此问题需要details or clarity。它目前不接受回答。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

6天前关闭
Improve this question
in all.csv

2023-07-18;5;018-118;speed violation;64;highway 27 OP RZ 27A-032 Rome "Rome",km 16 + 072;t
2023-07-19;4;018-118;driveways;8860;highway 27 OP RZ 27A-032 Rome, km 16 + 072;t
2023-07-19;5;018-118;speed violation;64;highway 27 OP RZ 27A-032 Rome "Rome",km 16 + 072;t
2023-07-20;4;018-118;driveways;8860;highway 27 OP RZ 27A-032 Rome "Local Industrie street", km 18 + 072;t

我想强调一下第三、第四和第六列

L=($(cut -d ";" -f3,4,6 test/all.csv))
SHAPKA='id;code;type;'
DATE=($(awk -F';' '{print $1}' test/all.csv | sort -u ))
ID_RTS=($(awk -F';' '{print $3}' test/all.csv  | sort -u ))

awk -F';' '{print $1}' test/all.csv |sort -u > test/test.csv
printf "$SHAPKA" >> test/test1.csv ; cat test/test.csv | awk 'BEGIN {ORS=";"}1' >> test/test1.csv

for l in ${DATE[@]}; do
    ((counter++))
done

awk -F';' '{print $5}' test/all.csv >> test/test4.csv  ; cat test/test4.csv | awk -v c="$counter" '{ORS=(NR%c?FS=";":RS)}1'  >>  test/test5.csv
awk -F\; 'NR==1, OFS=";" {print $0 }' test/test1.csv >> test.csv
for i in ${ID_RTS[@]} ; do
awk -F\; -v i="$i" 'NR>2, OFS=";" { print i , $0 }' test/test5.csv >> test.csv
done

我有:

id;code;type;2023-06-30;2023-07-01;2023-07-02;2023-07-03;2023-07-04;2023-07-05;2023-07-06;2023-07-07;2023-07-08;2023-07-09;2023-07-10;2023-07-11;2023-07-12;2023-07-13;2023-07-14;2023-07-15;2023-07-16;2023-07-17;2023-07-18;2023-07-19;2023-07-20;2023-07-21;2023-07-22;2023-07-23;2023-07-24;2023-07-25;2023-07-26;
018-118;32;24225;31;25164;43;27562;40;24877;34;20993;47;26631;48;25119;3;1847;317;1;9465;2;7035;2;7556;5;7681;2;8401
018-118;3;8416;9;9114;4;9482;4;9312;5;8459;1;8552;2;8563;5;8772;6;9006;4;11910;4;9276;5;8685;2;8261;2

第4和第6栏不见了。我试过:

IFS=";" set -- ${L} &&
    for v; do
        awk -F\; -v i="$v" 'NR>2, OFS=";" { print i , $0 }' test/test5.csv >> test.csv
    done

但得到错误:

bash: /usr/bin/awk: Argument list too long

我要id;code;type;2023-06-30;2023-07-01;2023-07-02;2023-07-03;2023-07-04;2023-07-05;2023-07-06;2023-07-07;2023-07-08;2023-07-09;2023-07-10;2023-07-11;2023-07-12;2023-07-13;2023-07-14;2023-07-15;2023-07-16;2023-07-17;2023-07-18;2023-07-19;2023-07-20;2023-07-21;2023-07-22;2023-07-23;2023-07-24;2023-07-25;2023-07-26; 018-118;speed violation;64;highway 27 OP RZ 27A-032 Rome "Rome",km 16 + 072;32;24225;31;25164;43;27562;40;24877;34;20993;47;26631;48;25119;3;1847;317;1;9465;2;7035;2;7556;5;7681;2;8401 018-118;driveways;8860;highway 27 OP RZ 27A-032 Rome, km 16 + 072;3;8416;9;9114;4;9482;4;9312;5;8459;1;8552;2;8563;5;8772;6;9006;4;11910;4;9276;5;8685;2;8261;2
是否可以将每个ID的一行相加
id;code;type;2023-06-30;2023-07-01;2023-07-02;2023-07-03;2023-07-04;2023-07-05;2023-07-06;2023-07-07;2023-07-08;2023-07-09;2023-07-10;2023-07-11;2023-07-12;2023-07-13;2023-07-14;2023-07-15;2023-07-16;2023-07-17;2023-07-18;2023-07-19;2023-07-20;2023-07-21;2023-07-22;2023-07-23;2023-07-24;2023-07-25;2023-07-26; 018-118;speed violation;highway 27 OP RZ 27A-032 Rome "Rome",km 16 + 072;32;24225;31;25164;43;27562;40;24877;34;20993;47;26631;48;25119;3;1847;317;1;9465;2;7035;2;7556;5;7681;2;8401;(32+24225+31+25164+43+27562+40+24877+34+20993+47+26631+48+25119+3+1847+317+1+9465+2+7035+2+7556+5+7681+2+8401) 018-118;driveways;highway 27 OP RZ 27A-032 Rome, km 16 + 072;3;8416;9;9114;4;9482;4;9312;5;8459;1;8552;2;8563;5;8772;6;9006;4;11910;4;9276;5;8685;2;8261;2;(3+8416+9+9114+4+9482+4+9312+5+8459+1+8552+2+8563+5+8772+6+9006+4+11910+4+9276+5+8685+2+8261+2)

7xllpg7q

7xllpg7q1#

要将一个文件的行前置到另一个文件的行上,可以使用paste
举例来说:

$ seq 10 >f1
$ seq 20 -1 11 >f2
$ paste -d ';' f1 f2
1;20
2;19
3;18
4;17
5;16
6;15
7;14
8;13
9;12
10;11
$

我不太懂你的代码。
看起来你可能正在尝试重新排列具有以下形式的数据:

date;???;id;code;value;type;???

在标题行中,每个不同的日期都有一列:

"id";"code";"type";date[;date...]

后面跟着行,其中每个id/code/type元组是唯一的:

id;code;type;value[;value...]

输入数据示例:

2023-07-18;5;018-118;speed violation;64;highway 27 OP RZ 27A-032 Rome "Rome",km 16 + 072;t
2023-07-19;4;018-118;driveways;8860;highway 27 OP RZ 27A-032 Rome, km 16 + 072;t
2023-07-19;5;018-118;speed violation;64;highway 27 OP RZ 27A-032 Rome "Rome",km 16 + 072;t
2023-07-20;4;018-118;driveways;8860;highway 27 OP RZ 27A-032 Rome "Local Industrie street", km 18 + 072;t

会变成:

id;code;type;2023-07-18;2023-07-19;2023-07-20
018-118;driveways;highway 27 OP RZ 27A-032 Rome "Local Industrie street", km 18 + 072;;;8860
018-118;driveways;highway 27 OP RZ 27A-032 Rome, km 16 + 072;;8860;
018-118;speed violation;highway 27 OP RZ 27A-032 Rome "Rome",km 16 + 072;64;64;

(我将日期列留空,输入中没有相应的id/code/type。
一个使用gawk的方法(可以按排序顺序处理数组):

gawk '
    BEGIN {
        FS = SUBSEP = ";"
        ORS = ""
        PROCINFO["sorted_in"] = "@ind_str_asc" 
    }
    {
        date[$1]
        tuple[$3,$4,$6]
        val[$3,$4,$6,$1] = $5
    }
    END {
        print "id;code;type"
        for (i in date) print FS i
        print "\n"

        for (i in tuple) {
            print i
            for (j in date) {
                k = i SUBSEP j
                print FS ( k in val ? val[k] : "" )
            }
            print "\n"
        }
    }
' test/all.csv >test.csv

相关问题