如何将多个txt转换为CSV,其中字段数据以空行分隔

如何将多个txt转换为CSV,其中字段数据以空行分隔

我在多个文本文件中有一些数据,其中字段由空行分隔。只有 4 个字段,但第二个字段中有更多子字段,可能是三个或更多。第一个字段始终是数字,0 或 1。

0
name_surname
1 yellow 1 brown 2 green
 short description

每个文件都以相同的方式制作。问题是我可以在第三个字段中有更多或更少的颜色。

每个 txt 都应该成为 csv 文件中的一行

0 [tab] name_surname [tab] 1 yellow ; 1 brown; 2 green [tab] "description"
1 [tab] name2_surname [tab] 1 brown; 1 blue [tab] "description"

经过一番阅读后,我发现我应该以某种方式使用 awk,但这超出了我的能力范围。

答案1

我知道如何使用sed

#!/bin/sed -nf
# Read second line & save first two lines to hold
N; h
# Read third line and perform transform
n; s/\([0-9]\+ [a-zA-Z]\+\) /\1; /g
# Append it to hold
H
# Give hold back
g
# Read fourth line
N
# Transform newlines
s/\n/\t/g
# Print result
p

或者在一行中:

sed -n 'N;h;n;s/\([0-9]\+ [a-zA-Z]\+\) /\1; /g;H;g;N;s/\n/\t/g;p' data.txt

答案2

这是另一个sed解决方案:

sed '/./!d;/[^0-9]/{
        /^[0-9]/s/ [0-9] / ;&/g
        H;$!d
    };x;y/\n/<tab>/
' <<\DATA
0
name_surname
1 yellow 1 brown 2 green
 short description

1
name2_surname
2 paisley 4 yellow 1 brown 2 green
 short description
2
name3_surname
1 blue
 short description
DATA

请注意,<tab>中的y/\n/<tab>/应该是一个实际<tab>字符。

###OUTPUT###

0       name_surname    1 yellow ; 1 brown ; 2 green     short description
1       name2_surname   2 paisley ; 4 yellow ; 1 brown ; 2 green         short description
2       name3_surname   1 blue   short description

相关内容