Bash 脚本将 txt 文件中的第四行导出到 csv
Bash Script Export fourth row in txt file to csv
我有 50 个目录,分别命名为 Subj1、Subj2 .. Subj50,每个目录包含 152 个文本文件,每个文件按以下命名格式命名
regional_vol_GM_atlas1.txt
..
..
regional_vol_GM_atlas152.txt
每个文件的数据排列成 4 行 2 列,其中列值由 space 分隔符分隔
667869 667869
580083 580083
316133 316133
9020 9020
我想将每个带有 header 的 txt 文件的第四行导出到我拥有的所有 50 个目录的 csv 文件中
我编写了一个脚本,该脚本从每个文本文件中导出数据以及 header 并创建一个 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是一个目录名
您可以使用 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 个目录,分别命名为 Subj1、Subj2 .. Subj50,每个目录包含 152 个文本文件,每个文件按以下命名格式命名
regional_vol_GM_atlas1.txt
..
..
regional_vol_GM_atlas152.txt
每个文件的数据排列成 4 行 2 列,其中列值由 space 分隔符分隔
667869 667869
580083 580083
316133 316133
9020 9020
我想将每个带有 header 的 txt 文件的第四行导出到我拥有的所有 50 个目录的 csv 文件中
我编写了一个脚本,该脚本从每个文本文件中导出数据以及 header 并创建一个 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是一个目录名
您可以使用 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