我有很多文本文件,其中有用信息的左边有一块垃圾。此块的宽度不断变化,因此我使用awk
计算有用信息的起始列,然后使用
idx=$(awk '/START/{print index($0,"START")}' in.txt)
idx=$(($idx-3))
colrm 1 $idx < in.txt > out.txt
如何将两个连续的idx
作业合并为一个?
答案 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)
答案 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]
就够了。