我有很多这样的文件:
cat test.data
name1
...
nameN
title1
...
titleM
abstract1
...
abstractO
ID
,其中数字N,M,O因文件而异。但是在所有文件中,字段之间都用空行分隔。我想将这些数据转换成csv,每个文件转换成一行,其中包含行(名称,标题,摘要,ID),如下所示:
name1 ...nameN|title1 ... titleM|abstract1 ... abstractO|ID
我试过awk和sed,但失败了。任何建议都会很有帮助。提前谢谢。
find -name 'test*.data' |
xargs awk -v n=$N -v t=$M -v a=$O '
BEGIN {
# lines to ignore
x[ i+=(n+1) ]
x[ i+=(t+1) ]
x[ i+=(a+1) ]
# number of lines per file
++i
}
!(FNR in x) {
printf("%s%s", $0, FNR<i?"|":"n")
}
' >>out.csv
- 适当定义
N
,M
,O
- 假设数据不包含分隔符
|
- 假设
out.csv
预先填充了合适的标题行
给定file
:
name1
name2
name3
title1
title2
abstract1
abstract2
abstract3
abstract4
ID
然后
awk '
BEGIN {FS = "n"; RS = ""}
{
record = $1
for (i=2; i<=NF; i++) record = record "," $i
printf "%s%s", sep, record
sep = "|"
}
END {printf "n"}
' file
输出name1,name2,name3|title1,title2|abstract1,abstract2,abstract3,abstract4|ID
使用RS = ""
,它将空白行序列视为记录FS = "n"
将换行符视为字段分隔符。