unix 从一个文件中读取文件名,并将文件名和内容存储到另一个文件中,|阿塞

y53ybaqx  于 2023-10-18  发布在  Unix
关注(0)|答案(3)|浏览(161)

如何从一个文件中读取文件名,并将文件名和内容存储到另一个文件中,|”“是的。
我有一个名为Filenames.txt的文件,其中存储了文本文件的名称。

> Cat Filenames.txt
File1.txt
File2.txt
File3.txt

> Cat File1
This is content of File1

> Cat File2
This is content of File2

> Cat File3
This is content of File3

所有这些文件Filenames.txt、File1.txt、File2.txt、File3.txt都存储在名为TestDir的目录中。
我的预期输出如下,生成一个新的文件在下面的格式.

> Cat Outputfile.txt
File1|This is content of File1
File2|This is content of File2
File3|This is content of File3

我尝试了下面的代码,得到了一些错误,

#!usr/bin/env bash
file=$(cat Filenames.txt)
y=$(pwd)
for line in $file
do
    x=$(cat "${line}")
   echo -e "${line}"|"${x}" >> Outputfile.txt
done

低于误差,

$ bash Script.sh
cat: 'file1.txt'$'\r': No such file or directory
Script.sh: line 7: : command not found
cat: 'file2.txt'$'\r': No such file or directory
Script.sh: line 7: : command not found
Script.sh: line 7: This is content of File3: command not found

电流输出:

test1_file
|
test2_file
|
test3_file|

注意:我在Window机器中使用了Bash shell
请帮帮我问候,Sooraj

5anewei6

5anewei61#

首先,你需要删除CRLF windows行结束:

dos2unix Filenames.txt

然后,我会做什么:

#!/usr/bin/env bash

while IFS= read -r file; do
    echo "$file|$(< $file)"
done < Filenames.txt > Outputfile.txt
cat Outputfile.txt
File1.txt|This is content of File1
File2.txt|This is content of File2
File3.txt|This is content of File3

你的shebang #!usr/bin/env bash是错误的,缺少usr上的前导/
我的版本是简化的,基于你的代码。
要逐行解析文件,不要使用for loop,读取https://mywiki.wooledge.org/BashFAQ/001

kq0g1dla

kq0g1dla2#

修复Filenames.txt中的Windows行结束问题后(请参阅Why does my tool output overwrite itself and how do I fix it?),请尝试以下操作:

#!/usr/bin/env bash

while IFS= read -r line
do
    if [[ -f "$line" ]]; then
        printf '%s|' "$line"
        cat "$line"
    fi
done < Filenames.txt > Outputfile.txt
pn9klfpd

pn9klfpd3#

关于Ruby:

ruby -e 'ARGV.each{|fn| puts "#{fn}|#{File.open(fn).read}"}' File{1..3}.txt

关于Bash:

for fn in File{1..3}.txt; do
    printf "%s|%s\n" "$fn" "$(cat "$fn")"
done

两者都打印:

File1.txt|This is content of File1
File2.txt|This is content of File2
File3.txt|This is content of File3

任何一个都可以通过以下方式重定向到所需的文件:

[Ruby or Bash] > outputfile.txt

如果你的文件名在一个文件中,你可以做:

ruby -e '$<.read.split(/\R/).each{|fn| puts "#{fn}|#{File.open(fn).read}"}' files.txt >outputfile.txt

(In Ruby,\R是通用的,无论行尾如何都可以工作。
在Bash中:

while IFS= read fn; do
    printf "%s|%s\n" "$fn" "$(< $fn)"
done  <files.txt > outputfile.txt

相关问题