Bash

將不同目錄中的文件內容用空行連接起來

  • May 15, 2019

我有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; 迴聲(上面註釋掉)但無濟於事。再次嘗試使用嵌套的 for 循環 - 我得到了相同的結果。我認為我的邏輯是錯誤的。

您的邏輯是正確的,但我必須進行一些修改才能使其正常工作。

  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"

如有疑問,請使用註釋和 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 

引用自:https://unix.stackexchange.com/questions/518951