我想使用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
。
答案 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|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两次读取文件。在第一行中标记最后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