【问题标题】:Bash Script Export fourth row in txt file to csvBash 脚本将 txt 文件中的第四行导出到 csv
【发布时间】:2017-04-07 14:32:42
【问题描述】:

我有一个名为 Subj1、Subj2 .. Subj50 的 50 个目录,每个目录包含 152 个文本文件,每个文件以下列命名格式命名

regional_vol_GM_atlas1.txt
..
..
regional_vol_GM_atlas152.txt

每个文件有4行2列的数据,其中列值用空格分隔符分隔

667869 667869
580083 580083
316133 316133
9020 9020

我想将每个带有标题的 txt 文件的第四行导出到我拥有的所有 50 个目录的 csv 文件中

我编写了一个脚本,它从每个文本文件中导出数据以及标题并创建一个 CSV,但该脚本会接收文本文件中的所有数据并粘贴到 CSV 而不是第 4 行。

#!/bin/bash


# pasting the file name as column name,  
for x in regional_vol_*.txt ; do  


   sed -i "1s/^/${x}\n/" ${x}

done
# Sorting the files and Subj1 directory name is file name of csv file 
paste -d, $(ls -1v regional_vol*.txt ) >> subj1.csv

下图描述了文件的输出。Subj1是目录名

【问题讨论】:

  • 所以你想为 50 个目录创建 50 个 csv Sub1, Sub2 .. Sub50 ..对吗?并且目录的每个csv只有每个文件的标题+第4行..对吗?
  • @ritesht93,不,我想要所有 50 个目录的 1 个 csv 文件,其中只有第四行 txt 文件以及标题

标签: bash csv export-to-csv


【解决方案1】:

您可以使用find 在所有子目录中递归查找所需文件,然后使用 sed 将第一行和最后一行附加到新文件中。

执行所有操作的主要命令有:

$ echo "x" > temp
$ find . -type d -iname "sub*" | sed 's/^.*\///' >> temp
$ find sub1/* -type f -printf "%f\n" | paste -s -d , > data.csv
$ for dir in *; do paste -s -d ',' <(tail -q -n 1 "$dir"/regional_vol_*.txt) >> data.csv; done 2> /dev/null
$ paste -d , temp <(sed '/^\s*$/d' data.csv)
x,regional_vol_GM_atlas1.txt,regional_vol_GM_atlas2.txt
sub1,1 1,2 2
sub2,3 3,4 4

这是我制作的示例结构:

$ ls -R
.:
sub1/  sub2/

./sub1:
regional_vol_GM_atlas1.txt  regional_vol_GM_atlas2.txt

./sub2:
regional_vol_GM_atlas1.txt  regional_vol_GM_atlas2.txt
$ cat sub1/* sub2/*
header1 header1
667869 667869
580083 580083
316133 316133
1 1
header2 header2
667869 667869
580083 580083
316133 316133
2 2
header3 header3
667869 667869
580083 580083
316133 316133
3 3
header4 header4
667869 667869
580083 580083
316133 316133
4 4
$ find sub1/* -type f -printf "%f\n" | paste -s -d , > data.csv
$ for dir in *; do paste -s -d ',' <(tail -q -n 1 "$dir"/regional_vol_*.txt) >> data.csv; done 2> /dev/null
$ cat data.csv 
regional_vol_GM_atlas1.txt,regional_vol_GM_atlas2.txt

1 1,2 2
3 3,4 4

【讨论】:

  • 我需要将输出作为一行而不是一列,正如您在我的问题中所附的图所示,我需要在单独的行中为每个目录输出,所以最后我会得到50行152列,每行代表目录,152列粘贴每个文本文件第4行的值
  • @DevanDev 你需要每个文件的标题,就像我把header1 header1 一样,或者你不需要吗?你只需要第 4 行?
  • 我需要标题。你可以看到我在我的问题中附上的图,我需要 csv 完全相同的方式,只有第 4 行,但对于所有 50 个目录
  • 我现在检查一下,看看我是否发现了一些问题
  • @DevanDev 文件名已经作为第一行存在,其余所有值都是每个文件的最后一行,我将添加将第一列作为目录名的命令
猜你喜欢
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2021-01-16
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多