将输出从字符串转换为整数

时间:2019-09-19 11:11:45

标签: bash shell unix

我正在尝试对一个小的工具进行编程,该工具可以合并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 *

2 个答案:

答案 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