我在一个目录中有5个大文本文件,其中有数百万条记录由管道分隔。我想要做的就是,当我运行BASH脚本时,它应该在第一行创建一个标题,如下所示:
TCR1|A|B|C|D|E|F|# of records
并且第一个单词(TCR
)是文件的新名称,最后一个是记录数。它们都应该针对每个文本文件进行更改。因此,当我运行一次脚本时,它应该在目录和脚本中找到5个文本文件,如上所述。每个文本文件中的输出应如下所示。
a.txt
TCR1|A|B|C|D|E|F|# of records in first text file
b.txt
TCR2|A|B|C|D|E|F|# of records in second text file
c.txt
TCR3|A|B|C|D|E|F|# of records in third text file
d.txt
TCR4|A|B|C|D|E|F|# of records in fourth text file
e.txt
TCR5|A|B|C|D|E|F|# of records in fifth text file
答案 0 :(得分:1)
我认为这可能就是你的意思,尽管你的问题很糟糕:
#!/bin/bash
# Don't crash if no text files present and allow upper/lowercase "txt/TXT"
shopt -s nullglob nocaseglob
# Declare "lines" to be numeric, rather than string
declare -i lines
for f in *.txt; do
lines=$(wc -l < "$f")
echo "$f|A|B|C|D|E|F|$lines"
cat "$f"
done
我不理解TCR
这件事,但也许这就是你想要的:
#!/bin/bash
# Declare "lines" to be numeric, rather than string
declare -i lines
for f in *.txt; do
lines=$(wc -l < "$f")
TCRthing="unknown"
[ "$f" == "a.txt" ] && TCRthing="TCR1"
[ "$f" == "b.txt" ] && TCRthing="TCR2"
[ "$f" == "c.txt" ] && TCRthing="TCR3"
[ "$f" == "d.txt" ] && TCRthing="TCR4"
[ "$f" == "e.txt" ] && TCRthing="TCR5"
echo "$TCRthing|A|B|C|D|E|F|$lines"
cat "$f"
done
请注意,有更简单,更惯用的方式,例如,你可以运行:
more *.txt
然后按 Ctrl G 以获取您正在查看的文件以及您到达的位置以及每个文件的行数。您也可以按: n 移动到下一个文件,: p 移动到上一个文件。并且 1 G 返回当前文件的顶部, G 转到当前文件的底部。