Bash 如何删除100行文本文件中每10行中的最后3行?

Bash 如何删除100行文本文件中每10行中的最后3行?,bash,Bash,假设我的文件是 a b c d e f g h 我 j 我希望我的输出是 a b c d e f g 我的文件有100行长,因此代码必须在每10行代码块中删除最后3行。我尝试使用下面的代码,但无法让它删除一个范围 awk'NR%7=0'文件.txt awk'{if(NR%10

假设我的文件是

  • a
  • b
  • c
  • d
  • e
  • f
  • g
  • h
  • j
  • 我希望我的输出是

  • a
  • b
  • c
  • d
  • e
  • f
  • g
  • 我的文件有100行长,因此代码必须在每10行代码块中删除最后3行。我尝试使用下面的代码,但无法让它删除一个范围

    awk'NR%7=0'文件.txt
    
    awk'{if(NR%10<8&&NR%10!=0){print}}file.txt
    
    您需要mod 10以每10跳过一些行,而不是mod 7。

    awk'{if(NR%10<8&&NR%10!=0){print}}file.txt
    

    您需要mod 10以每10跳过一些行,而不是mod 7。

    Awk的
    NR
    变量包含以
    1
    开头的行号
    NR-1
    是以
    0
    开头的行号

    NR-1
    除以
    10
    的提示对于每个10行块的前7行是
    0..6
    ,对于最后三行是
    7..9

    该命令非常简单,如下所示:

    awk '(NR - 1) % 10 < 7' file.txt
    
    awk'(NR-1)%10<7'file.txt
    
    Awk的
    NR
    变量包含以
    1
    开头的行号
    NR-1
    是以
    0
    开头的行号

    NR-1
    除以
    10
    的提示对于每个10行块的前7行是
    0..6
    ,对于最后三行是
    7..9

    该命令非常简单,如下所示:

    awk '(NR - 1) % 10 < 7' file.txt
    
    awk'(NR-1)%10<7'file.txt
    
    嗯,
    NR
    是当前行号。它从1开始计数(第一行)。现在,使用数学运算编写一个条件,条件为
    NR
    ,当行号为“每10行块中最后3行”时,条件为真,否则为假。你怎么写这样的条件?awk和KamilCuk让我感到羞耻,没有用他的好榜样为你提供答案。不过,我给你一个提示,试试这个程序:awk'{print NR%10,$0}'usinggnu
    sed
    ,一行代码:
    sed'8~10d;9~10d;10~10d'file.txt
    嗯,
    NR
    是当前行号。它从1开始计数(第一行)。现在,使用数学运算编写一个条件,条件为
    NR
    ,当行号为“每10行块中最后3行”时,条件为真,否则为假。你怎么写这样的条件?awk和KamilCuk让我感到羞耻,没有用他的好榜样为你提供答案。不过,我给你一个提示,试试这个程序:awk'{print NR%10,$0}'usinggnu
    sed
    ,一行代码:
    sed'8~10d;9~10d;10~10d'file.txt
    或者您可以尝试以下方法:awk'NR%10<8&&NR%10>0'file.txt为什么要测试
    NR%10!=0
    ?当输入文件为空时,
    NR=0
    NR=10
    20
    30
    …会发生这种情况。在这里测试是没有意义的。@LéaGris,是的,这些线路确实发生了这种情况。(S) 他不想要那些台词。(S) 他希望每10行中的最后3行被删除。这将是第8、9和10行。或者您可以尝试以下操作:awk'NR%10<8&&NR%10>0'文件。txt为什么要测试
    NR%10!=0
    ?当输入文件为空时,
    NR=0
    NR=10
    20
    30
    …会发生这种情况。在这里测试是没有意义的。@LéaGris,是的,这些线路确实发生了这种情况。(S) 他不想要那些台词。(S) 他希望每10行中的最后3行被删除。那就是第8、9和10行。为什么不
    NR%10呢?因为对于第10行,
    NR
    10
    NR%10
    0
    。第10行必须删除,但会显示,因为
    10%0<8
    。第20、30、40行a.s.o.也会发生同样的情况。任何使用提醒的技巧只有在计数从
    0
    开始(或从除法器的倍数开始)时才有效。要使其从
    0
    开始,从所有值中减去第一个值就足够了。如果结果必须包括原始值,则在末尾恢复调整(此处不需要)。为什么不
    NR%10,因为对于第10行,
    NR
    10
    ,而
    NR%10
    0
    。第10行必须删除,但会显示,因为
    10%0<8
    。第20、30、40行a.s.o.也会发生同样的情况。任何使用提醒的技巧只有在计数从
    0
    开始(或从除法器的倍数开始)时才有效。要使其从
    0
    开始,从所有值中减去第一个值就足够了。如果结果必须包括原始值,则在结束时恢复调整(此处不需要)。