将两个bash语句合并为一个

时间:2017-11-27 12:23:06

标签: bash awk

我有很多文本文件,其中有用信息的左边有一块垃圾。此块的宽度不断变化,因此我使用awk计算有用信息的起始列,然后使用

删除左侧的列
idx=$(awk '/START/{print index($0,"START")}' in.txt)
idx=$(($idx-3))
colrm 1 $idx < in.txt > out.txt

如何将两个连续的idx作业合并为一个?

5 个答案:

答案 0 :(得分:2)

试试这个:

idx=$(( $(awk '/START/{print index($0,"START")}' in.txt) - 3 ))

或:

idx=$(awk '/START/{print index($0,"START")}' in.txt); idx=$(($idx-3))

答案 1 :(得分:2)

您可以尝试:

idx=$(( $(awk '/START/{print index($0,"START")}' in.txt) - 3 ))

答案 2 :(得分:1)

理想的方法是使用END中的Awk子句在处理完所有行后执行操作,如下所示。另外,检查数字是否为零的三元运算符也很方便。

idx_3=$(awk '/START/{pos=index($0,"START")}END{print pos?(pos-3):0}' in.txt)

您可以修改三元运算符以检查pos>=3,具体取决于您的方便程度。

Awk中执行此操作的更加方便的方法是使用其match()函数并使用RSTART标记记录开头

idx_3=$(awk 'match($0, /START/){pos=RSTART; next}END{print pos?(pos-3):0}' in.txt)

Special built-in variables in Awk

答案 3 :(得分:1)

真正做你想做的事情的方法是只测试START一次,然后保存它的起始位置,然后打印该值减去3:

idx=$(( $(awk 's=index($0,"START"){print s-3; exit}' in.txt) ))

为了提高效率,我会添加; exit

答案 4 :(得分:0)

idx=$[$(awk '/START/{print index($0,"START")}' in.txt) - 3]

就够了。