gpt4 book ai didi

linux - Unix 如果为空则跳过第一行

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:24 31 4
gpt4 key购买 nike

我有一个正在运行的脚本,它会将一个文本文件作为输入,然后在跳过前 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 语句,如果它是空的,则跳过第一行。

希望这是足够的信息

谢谢

最佳答案

改用这个 awk:

awk 'NR == 1 { I = NF ? 12 : 13 } NR > I' "IMSI$r.txt"

您可以将两个 awk 简化为一个:

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"

附言始终将变量放在 "" 周围,以防止分词和任何可能的路径名扩展。

更新

如果文件是 DOS 格式,你需要指定一个不同的 RS:

awk -v RS='\r\n' ...

或者去掉每行开头的\r:

awk ... '{ sub(/\r/, "") } ...

使用 NF 检查字段数以验证文件是否为空可能就足够了,但您也可以严格检查真正的空白行(没有其他空格):

NR == 1 { I = /^$/ ? 13 : 12 }

关于linux - Unix 如果为空则跳过第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25357133/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com