Shell脚本-如何在不重复行的情况下合并两个文本文件

时间:2020-04-22 11:19:32

标签: linux bash shell

我的案子显然很容易,但是我不能以简单的方式来做,我需要它,因为实际文件很大。

因此,我有两个txt文件,我想生成一个包含两个内容的新文件,而不必重复两行。像这样的东西:

file1.txt

192.168.0.100
192.168.0.101
192.168.0.102

file2.txt

192.168.0.100
192.168.0.101
192.168.1.200
192.168.1.201

我想在上面合并这些文件并生成另一个这样的文件:

result.txt

192.168.0.100
192.168.0.101
192.168.0.102
192.168.1.200
192.168.1.201

任何简单的建议吗? 谢谢

2 个答案:

答案 0 :(得分:2)

awk中有一个半标准的习惯用法,用于删除重复项:

awk '!a[$0]++ {print}' file1.txt file2.txt

数组a对每行的出现进行计数,但是仅在第一次添加时(即a[$0]在递增之前为0时)打印一行。

这比对输入进行排序(并保留输入顺序)的渐近速度更快,但需要更多的内存。

答案 1 :(得分:1)

如果更改顺序不是问题:

$instanceName = ".\SQLEXPRESS"
$loginName = "ShufflrrAdmin1"
$dbUserName = "ShufflrrAdmin"
$password = "Shufflrr@123"
$databasenames = "Shufflrr", "ShufflrrScheduler"
$roleName = "db_owner"

$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList $instanceName

# drop login if it exists
if ($server.Logins.Contains($loginName ))  
{   
    Write-Host("Deleting the existing login $loginName.")
       $server.Logins[$loginName].Drop() }
$login = New-Object `
-TypeName Microsoft.SqlServer.Management.Smo.Login `
-ArgumentList $server, $loginName
$login.LoginType = [Microsoft.SqlServer.Management.Smo.LoginType]::SqlLogin
$login.PasswordExpirationEnabled = $false
$login.Create($password)
Write-Host("Login $loginName created successfully.")

foreach($databaseToMap in $databasenames)  
{ $database = $server.Databases[$databaseToMap]
    if ($database.Users[$dbUserName])
    {
        Write-Host("Dropping user $dbUserName on $database.")
        $database.Users[$dbUserName].Drop()}

    $dbUser = New-Object `
    -TypeName Microsoft.SqlServer.Management.Smo.User `
    -ArgumentList $database, $dbUserName
    $dbUser.Login = $loginName
    $dbUser.Create()
    Write-Host("User $dbUser created successfully.")

    #assign database role for a new user
    $dbrole = $database.Roles[$roleName]
    $dbrole.AddMember($dbUserName)
    $dbrole.Alter()
    Write-Host("User $dbUser successfully added to $roleName role.")
}

首先,这对两个文件的行(在内存中)进行排序,然后遍历它们,并且仅输出每个唯一行一次(sort -u file1.txt file2.txt > result.txt 标志)。

相关问题