如何使用BASH脚本在文本文件上创建动态标头

时间:2018-01-04 21:14:41

标签: linux bash unix

我在一个目录中有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

1 个答案:

答案 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 转到当前文件的底部。