删除文件中的行,直到特定行

时间:2019-11-18 05:50:33

标签: bash shell

我想使用shell脚本和循环概念解决这个问题

我有一个文本文件(file.txt),其数据如下:

ABC 123 hahah 1897237
ABC 123 hahah 1897237
ABC 123 hahah 156756737
FDC 123 hasddhs 0
FDC 123 hasddhs 0
ABC 123 hahah 18567737
ABC 123 hahah 1897237
ABC 123 hahah 167767
ABC 123 hahah 1897237
FDC 123 hasddhs 0
GXT 123 asdfg 0

并且我想从最后一行删除行,直到行以相同名称(即ABC)开始。

预期输出为:

ABC 123 hahah 1897237
ABC 123 hahah 1897237
ABC 123 hahah 156756737
FDC 123 hasddhs 0
FDC 123 hasddhs 0
ABC 123 hahah 18567737
ABC 123 hahah 1897237
ABC 123 hahah 167767
ABC 123 hahah 1897237

即使以0结尾的行在中间,我也不在乎,但不应在最后一行。如果统一名称开头的行以0结尾,我也想抛出一个错误。

示例:ABC 123 hahah 0

2 个答案:

答案 0 :(得分:0)

我会给您一个大概的想法,但这并不是一个完整的解决方案,因为我觉得这里没有足够的信息。

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

这只是打印包含“ ABC”的所有行,并将它们写入新文件。如果仅此而已,则可以使用mv用新文件覆盖原始文件。

答案 1 :(得分:0)

使用tac

如果您有交谘会,可以进行tac|sed|tac

kent$  tac file|sed '0,/^ABC/{/^ABC/!d}'|tac
ABC 123 hahah 1897237
ABC 123 hahah 1897237
ABC 123 hahah 156756737
FDC 123 hasddhs 0
FDC 123 hasddhs 0
ABC 123 hahah 18567737
ABC 123 hahah 1897237
ABC 123 hahah 167767
ABC 123 hahah 1897237

awk单线纸

您还可以让awk两次读取文件。在第一行中标记最后ABC行,然后在第二行中打印所需的行:

kent$  awk 'NR==FNR&&/^ABC/{n=FNR;next}FNR<=n ' file file
ABC 123 hahah 1897237
ABC 123 hahah 1897237
ABC 123 hahah 156756737
FDC 123 hasddhs 0
FDC 123 hasddhs 0
ABC 123 hahah 18567737
ABC 123 hahah 1897237
ABC 123 hahah 167767
ABC 123 hahah 1897237