【问题标题】:Merge multiple files and split output to multiple files based in each column (post 2)合并多个文件并将输出拆分为基于每列的多个文件(帖子 2)
【发布时间】:2019-05-08 00:54:49
【问题描述】:

我有许多行和列格式完全相同的 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

输入2

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 不如预期的那样好,因为在第一行中有空值,我的代码不能按预期工作。此外,我还有一个问题是要在每个文件的第 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个文件requerides,但是文件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*

感谢您的帮助

【问题讨论】:

  • 有趣的是,您没有在脚本有问题的地方发布输入文件。
  • @Ed 先生,已更新输入文件和代码,我使用 shellcheck.net 站点尝试改进代码。
  • 嗨 karakfa,输入文件中的问题是只有当有像“,”这样的空值时,代码才能正常工作,输入文件中至少应该有 ,0,0 ...
  • @OXXO 仅供参考,如果您要联系的是我,我看不到带有 @Mr Ed 任何变体标记的消息。您必须使用标签 @EdMorton 才能看到它们。
  • @EdMorton 非常感谢代码

标签: awk


【解决方案1】:

使用 GNU awk 处理 ENDFILE 并自动处理多个打开的文件,并假设您发布的示例输出显示 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
---

【讨论】:

  • 不客气。再一次,“埃德先生”不会引起我的注意。使用@EdMorton 与我联系并在我们已经交谈时向我致意,请使用Ed 并删除Mr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 2019-07-13
  • 2021-11-18
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
相关资源
最近更新 更多