将不同目录中的文件内容连接起来,中间用空行

将不同目录中的文件内容连接起来,中间用空行

我的文件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

您的逻辑是正确的,但我必须进行一些修改才能使其正常工作。

  1. 后面添加了缺失的空格IFS(否则错误)
  2. 将引用更改"$line/*""$line"/*(否则sed: can't read 2/*: No such file or directory
  3. 引用$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 

相关内容