我有一个运行的脚本,它将把文本文件作为输入,然后在跳过前12行后取最后一列,然后将它们输出到另一个文本文件中。
for (( r=1; r<5; r++));
do
awk 'NR>12' IMSI$r.txt | awk '{print $NF "\r"}' > N$x
awk 'NR>12' IMSI$r.txt | awk '{print $NF "\r"}' >> out
x=$(($x+1))
done
我的问题是,有时,文件中的第一行是空的,我将不得不跳过它。
所以代码将变成类似
的代码for (( r=1; r<5; r++));
do
%If (line1 is empty) then delete line and overwrite the new file
awk 'NR>12' IMSI$r.txt | awk '{print $NF "\r"}' > N$x
awk 'NR>12' IMSI$r.txt | awk '{print $NF "\r"}' >> out
x=$(($x+1))
done
我试过了:
if [ ${line:-null} = null ];
then awk 'NR>1'
这是对的吗? 如何在不获取空文件的情况下在IMSI $ r.txt上覆盖它?
感谢帮助人员。
编辑:
请求的示例:
text1.txt:
1 xxx 123
2 yyy 123
3 zzz 123
所以输出将是
123
123
123
text2.txt:
"empty line"
1 xxx 123
2 xxx 123
3 xxx 123
输出:
123
123
123
如您所见,两个文件将提供相同的输出,而它们具有不同的结构(第二个文件在开始时有一个空行)
我的代码不起作用,因为它会每次跳过12行,我不知道是否必须跳过12或13,因为有时第一行是空的。所以我必须添加一个IF语句,如果它是空的则跳过第一行。
希望这是足够的信息
由于
答案 0 :(得分:3)
改为使用此awk
:
awk 'NR == 1 { I = NF ? 12 : 13 } NR > I' "IMSI$r.txt"
您可以将两个问题简化为一个:
awk 'NR == 1 { I = NF ? 12 : 13 } NR > I { print $NF "\r" }' "IMSI$r.txt"
您也可以指定ORS
而不是"\r"
:
awk -v OFS='\r\n' 'NR == 1 { I = NF ? 12 : 13 } NR > I { print $NF }' "IMSI$r.txt"
最后为了提高效率,请使用tee
而不是两次调用awk
:
awk 'NR == 1 { I = NF ? 12 : 13 } NR > I { print $NF "\r" }' "IMSI$r.txt" | tee -a out > "N$x"
P.S。始终将变量置于""
左右,以防止分词和任何可能的路径名扩展。
如果文件是DOS格式,则需要指定不同的RS:
awk -v RS='\r\n' ...
或者在每行的开头删除\r
:
awk ... '{ sub(/\r/, "") } ...
使用NF
检查字段数以确认文件是否为空可能已足够但您可以严格检查实际空白行(没有其他空格):
NR == 1 { I = /^$/ ? 13 : 12 }
答案 1 :(得分:0)
听起来你需要的只是一个变量(下面是c
),只有当你有字段时才会增加/测试:
for (( r=1; r<5; r++));
do
awk -v OFS='\r\n' 'NF && ++c>12{print $NF}' "IMSI$r.txt" | tee "N$x" >> out
x=$(($x+1))
done