我的案子显然很容易,但是我不能以简单的方式来做,我需要它,因为实际文件很大。
因此,我有两个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
任何简单的建议吗? 谢谢
答案 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
标志)。