我正在尝试对一个小的工具进行编程,该工具可以合并unix服务器上的某些文件。我现在被迫将20个文件合并为1。所有这些文件都包含一个标头和预告片,需要将其删除,并且新创建的文件需要具有标头和预告片。标头和预告片对我来说创建起来有些棘手(必须至少有334个字符)。除了预告片,我能够创建所有内容。特殊的是预告片应包含行数。
我已经像这样设置了我的小工具:
//loop to cat all 20 files (remove header and trailer)
//generate header from date
//execute wc -l on generated file and add +1 (bc trailer is missing)
//append trailer with executed wc -l information in it
我尝试了几个将+1添加到预告片中的命令,但没有一个能正常工作:
这是我到目前为止的工作:
lineCount=echo more someFile.dat | wc -l
echo $lineCount
//echo "$((lineCount + 1))" -> 1
//echo "$(($lineCount + 1))" -> 1
//let "lineCount+=1" -> 1
//$lineCount=lineCount+1 -> won't work
//$lineCount=$lineCount+1 -> won't work
//x=$lineCount+1 -> won't work
这是回声$lineCount
的输出(不做任何更改或任何更改),数字前似乎有两个空格
163108
我的目标是,这个数字应该是163108
而不是163109
编辑:
我的输入文件如下所示:
HFFP20190 *
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYXXXXXXXXXXXXXX YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
ABCDEFGHIJKLMNOPQWERSTUVWXYZ ASDFASDFASDFASDFASDFASDFASDFASDFASDFASD
TFFP2019000031795 *
而HFFP是标题,而TFFP是结尾->标题和结尾之间的主要区别是最后一个数字(31795),其中包含文件中的行数。合并后的输出应如下所示:
HFFP20190 *
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYXXXXXXXXXXXXXX YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
ABCDEFGHIJKLMNOPQWERSTUVWXYZ ASDFASDFASDFASDFASDFASDFASDFASDFASDFASD
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYXXXXXXXXXXXXXX YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
ABCDEFGHIJKLMNOPQWERSTUVWXYZ ASDFASDFASDFASDFASDFASDFASDFASDFASDFASD
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYXXXXXXXXXXXXXX YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
ABCDEFGHIJKLMNOPQWERSTUVWXYZ ASDFASDFASDFASDFASDFASDFASDFASDFASDFASD
...
TFFP2019000163109 *
答案 0 :(得分:0)
您可以尝试以下方法:
# get only the lines from wc command
lineCount=$(wc -l someFile.dat | cut -d' ' -f1)
# add 1
((lineCount++))
echo "$lineCount"
答案 1 :(得分:0)
因为
lineCount=echo
将字符串“ echo”分配给变量。
lineCount=echo more someFile.dat | wc -l
运行命令
more someFile.dat | wc -l
具有输出到标准输出,而不是输出到变量,而临时仅在单个命令的持续时间内分配lineCount="echo"
。
对于记录,将标准输出捕获到变量的语法为
lineCount=$(wc -l <someFile.dat)
我将无用的more
和更无用的echo
排除在外。
总的来说,更好的解决方案可能是将所有这些重构为Awk脚本。您还没有足够详细地描述页眉和页脚的逻辑,但是类似
awk '
# Skip first line in all files except the first
FNR==1 && NR>1 { next }
# Print and increment, excluding trailer
!/^TFFP/ { print; c++ }
# Add back last trailer
END { sub(/000[1-9][0-9]*$/, "000" 1+c); print} ' someFiles*
通配符someFiles*
将需要替换为实际上与输入文件匹配的顺序正确的东西。也许*.dat
?