我在行和列上有许多格式完全相同的csv文件。在下面的示例中,我仅显示2个文件作为输入,但是我有很多具有相同特征的文件
目的是对每个输入文件执行以下操作:
在第1、2和3行中取值。
第一个文件中的示例
6174
15
3
然后,从第4行到第6行打印第一列。
对所有输入文件执行相同的过程,并输出包含所有已读取文件的所有信息的文件。
为所有文件和第一列完成该过程时。其余的列都做同样的事情
最后,创建的总文件输出将为4个文件,因为每个文件中有4列。
输入1
Record Number 6174
Vibrator Identification 15
Start Time Error 3 us
1.6,19.5,,,
1.7,23.2,28.3,27.0
1.8,26.5,27.0,25.4
Input2
Record Number 6176
Vibrator Identification 17
Start Time Error 5 us
1.6,18.6,,,
1.5,23.5,19.7,19.2
1.3,26.8,19.2,18.5
使用下面的代码,我得到了4个输出文件,尽管文件3-4并不理想,因为我希望得到4个输出文件,因为在第一行中有空值,我的代码无法正常工作。另外,在获取每个文件的第3行中的良好值时,我还有一个问题。我获取了我们而不是数字。
输出文件1
6174,15,3,1.6,1.7,1.8
6176,17,5,1.6,1.5,1.3
输出文件2
6174,15,3,19.5,23.2,26.5
6176,17,5,18.6,23.5,26.8
输出文件3
6174,15,3,0,0,28.3,27.0
6176,17,5,0,0,19.7,19.2
输出文件4
6174,15,3,0,0,27.0,25.4
6176,17,5,0,0,19.2,18.5
使用的代码
该代码几乎可以正常工作,合并csv文件并输出重新请求的4个文件,但是当值为空时,文件3-4存在问题。
for f in *.csv ; do
awk -F, 'NR==1 {n=split($NF,f," ");print f[n]}' "$f" >> a-"$f"
awk -F, 'NR==2 {n=split($NF,f," ");print f[n]}' "$f" >> a-"$f"
awk -F, 'NR==3 {n=split($NF,f," ");print f[n]}' "$f" >> a-"$f"
sed -i 's/\r$//' a-"$f"
for i in seq $(1...4); do
awk -F, 'NR>=4{f=1} f{print '"$""$i"'} f==6{exit}' "$f" > "a""$i"-"$f"
cat a-"$f" a"$i""-""$f" >> t"$i"
sed -i 's/\r$//' t"$i"
done
for i in seq $(1...4); do
awk -v RS= -v OFS=',' -v ORS='\n' '{$1=$1}1' t"$i" > file"$i".csv
done
done
rm -f ./a* ./t*
感谢您的帮助
答案 0 :(得分:1)
使用用于ENDFILE的GNU awk并自动处理多个打开的文件,并假定您发布的示例输出显示file3和file4的字段多于file1和file2,这是一个错误:
$ cat tst.awk
BEGIN { FS=OFS=","; numHdrFlds=3 }
FNR <= numHdrFlds {
gsub(/[^0-9]/,"")
hdr = (FNR==1 ? "" : hdr OFS) $0
next
}
{
for (i=1; i<=NF; i++) {
data[i] = (FNR==(numHdrFlds+1) ? "" : data[i] OFS) ($i)+0
}
}
ENDFILE {
for ( fileNr=1; fileNr<=NF; fileNr++ ) {
print hdr, data[fileNr] > ("outputFile" fileNr)
}
}
。
$ awk -f tst.awk file1 file2
$ for i in outputFile*; do echo "$i"; cat "$i"; echo "---"; done
outputFile1
6174,15,3,1.6,1.7,1.8
6176,17,5,1.6,1.5,1.3
---
outputFile2
6174,15,3,19.5,23.2,26.5
6176,17,5,18.6,23.5,26.8
---
outputFile3
6174,15,3,0,28.3,27
6176,17,5,0,19.7,19.2
---
outputFile4
6174,15,3,0,27,25.4
6176,17,5,0,19.2,18.5
---