我的文件dir1.txt
包含以下目录的名称:
2
3
4
目录 2 包含文件 2_1.txt 和 2_2.txt
目录 3 包含文件 3_1.txt 和 3_2.txt
目录 4 包含文件 4_1.txt 和 4_2.txt
每个文件包含两行。
然后我创建了以下嵌套循环:
#!/bin/bash
input="dir1.txt"
while IFS=read -r line
do
for j in "$line/*"
do sed -e '$s/$/\n/' $j
#cat $j; echo
done >> output.txt
done < "$input"
基本上,我想在连接的文件之间有一个空行。通过上面的循环,我只在 dir 2 中的最后一个文件内容和 dir 3 中的第一个文件之间得到一个空行,以及 dir 3 中的最后一个文件内容和 dir 4 中的第一个文件之间有一个空行,但我也想要一个空行同一目录中文件的串联内容之间。我尝试过使用 cat $j; echo(上面已注释)但无济于事。再次尝试使用嵌套 for 循环 - 我得到了相同的结果。我认为我的逻辑是错误的。
答案1
您的逻辑是正确的,但我必须进行一些修改才能使其正常工作。
- 后面添加了缺失的空格
IFS
(否则错误) - 将引用更改
"$line/*"
为"$line"/*
(否则sed: can't read 2/*: No such file or directory
) - 引用
$j
(只为更好的风格)
sed
和版本都cat/echo
做了它们应该做的事情。
#!/bin/bash
input="dir1.txt"
while IFS= read -r line
do
for j in "$line"/*
do
sed -e '$s/$/\n/' "$j"
#cat "$j"; echo
done >> output.txt
done < "$input"
答案2
如有疑问,请使用注释和 stderr 输出。
另外,您的脚本的某些方面在 GNU bash 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu) 上对我不起作用
#!/bin/bash
input=dir1.txt
# Cycle through input
for dir in $(cat $input)
do
# Prints to stderr
(echo "INFO - Dir: $dir" 1>&2)
# Is dir a directory?
if [ -d $dir ]
then
# Cycle through files
for file in $dir/*
do
# Prints to stderr
(echo "INFO - File: $file" 1>&2)
# Print contents
cat $file
# Blank line.
echo
done
fi
done >> output.txt