gpt4 book ai didi

linux - 根据字段拆分文件并保存在使用根名称创建的子目录中

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:14 24 4
gpt4 key购买 nike

我在处理几段代码时遇到了问题,不幸的是,我不是 Linux Bash 编程方面的专家,所以我一整天都在尝试寻找适合我的任务的东西,但没有成功,希望你能帮助我指明正确的方向。

我有很多大文件,我想根据每个文件中的第三个字段进行拆分,我想在每个子文件中保留标题,并将创建的子文件保存在创建的新目录中从文件的根名称。

原始目录存放的初始文件有:

Downloads/directory1/Levels_CHG_Lab_S_sample1.txt
Downloads/directory1/Levels_CHG_Lab_S_sample2.txt
Downloads/directory1/Levels_CHG_Lab_S_sample3.txt

等等..

这些文件中的每一个都有 200 列,第 3 列包含从 1 到 10 的值。我想根据此列的值拆分上面的每个文件,并将子文件存储在子文件夹中,例如子文件夹“Downloads/directory1/sample1”将包含 10 个文件(带有标题行)由拆分文件 Downloads/directory1/Levels_CHG_Lab_S_sample1.txt。

我现在已经为这些步骤尝试了许多不同的步骤,但都没有成功。我一定是把它变得比现在更复杂,因为我尝试过的代码看起来很棒......这是我尝试使用的代码:

FILES=Downloads/directory1/

for f in $FILES
do
# Create folder with root name by stripping file names
fname=${echo $f | sed 's/.txt//;s/Levels_CHG_Lab_S_//'}
echo "Creating sub-directory [$fname]"
mkdir "$fname"

# Save the header
awk 'NR==1{print $0}' $f > header

# Split each file by third column
echo "Splitting file $f"
awk 'NR>1 {print $0 > $3".txt" }' $f

# Move newly created files in sub directory
mv {1..10}.txt $fname # I have no idea how to do specify the files just created

# Loop through the sub-files to attach header row:
for subfile in $fname
do
cat header $subfile >> tmp_file
mv -f tmp_file $subfile
done
done

所有这些步骤对我来说似乎很复杂,如果你能帮助我以正确的方式解决这个问题,我将不胜感激。非常感谢您的帮助。-fra

最佳答案

您的代码现在有一些问题。首先,您绝不会列出下载目录的内容。您只需将 FILES 变量设置为一个字符串,即该目录的路径。你需要这样的东西:

FILES=$(ls Downloads/directory1/*.txt)

您也永远不会 cdDownloads/directory1 文件夹,因此您的 mkdir 会在 cwd 中创建目录;可能不是您想要的。

如果您知道第 3 列中的数字始终介于 1 到 10 之间,我会在拆分文件之前使用标题行预填充这些文件。

试试这段代码来做你想做的事(未经测试):

BASEDIR=Downloads/directory1/
FILES=$(ls ${BASEDIR}/*.txt)

for f in $FILES; do
# Create folder with root name by stripping file names
dirname=$(echo $f | sed 's/.txt//;s/Levels_CHG_Lab_S_//')
dirname="${BASENAME}/${dirname}/"
echo "Creating sub-directory [$dirname]"
mkdir "$dirname"

# Save the header to each file
HEADER_LINE=$(head -n1 $f)
for i in {1..10}; do
echo ${HEADER_LINE} > ${dirname}/${i}.txt
done

# Split each file by third column
echo "Splitting file $f"
awk -v dirname=${dirname} 'NR>1 {filename=dirname$3".txt"; print $0 >> filename }' $f
done

关于linux - 根据字段拆分文件并保存在使用根名称创建的子目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21370522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com