Powershell ½ºÅ©¸³Æ® ¼öÁ¤ Á» µµ¿ÍÁÖ¼¼¿ä (ÅýºÆ® Áߺ¹ üũ)

dateno1   
   Á¶È¸ 1508   Ãßõ 0    

쪽팔리면 질문하지 맙시다. 소중한 답변 댓글을 삭제하는건 부끄러운 일 입니다 

Get-Content "./text.txt" | Group-Object | Where-Object { $_.Count -gt 1 } | Select -ExpandProperty Name


현제 내용은 이거 1줄이 끝입니다 (text.txt를 열어서 중복 라인을 체크후 표시해줍니다)


굳이 ps1 포맷을 안 쓰고, Python같은걸로 처리해도 상관 없습니다 (아니면 달성 가능한 소프트를 소개해주셔도 됩니다)


목표는 2가지입니다 (둘중 하나 달성 가능하면 됩니다)

1. 현제 구조면 싱글 스레드로 처리하다보니 수십만 (현제 40만대인데 차후 더 늘어날 수 있습니다) 라인 처리에 너무 오래 걸립니다


가능하다면 분할해서 4~6스레드정도로 처리하고 싶습니다 (전체 라인을 카운터해서 필요한 스레드 숫자로 나눈후 시작 지점을 각각 그만큼 더해서 지정하면 될꺼같습니다)


2. 진척도 표시및 이어서 처리 기능을 추가하고 싶습니다


현제 구조면 완료까지 아무것도 안 뜨고, 1~끝까지 처리인데 현제 처리중인 라인의 수치를 표시 + 실행시 시작과 끝을 입력하면 해당 구간을 처리하고, 안 하면 처음~끝까지 처리하게 하고자 합니다


만일 이게 가능해지면 여러개 실행해서 라인을 지정해서 실행하면 멀티 스레드로 처리가 가능하므로 1번이 필요 없어집니다


결국 2가지라 적었지만, 궁극적으로는 멀티 스레드로 처리하는게 목표라 보시면 됩니다 (싱글 스레드로 41.5만 라인 택스트 처리하니 끔찍한 시간이 걸립니다)

맨날 삽질만 하고 삽니다

http://www.2cpu.co.kr/hardware_2014/44147
컴 케이스 작다고 불타거나 하지 않아요

ªÀº±Û Àϼö·Ï ½ÅÁßÇÏ°Ô.
ChatGPT 3.5 ·Î µ¹¸°°Çµ¥, ¾Æ¸¶ Á¤È®È÷ Çѹø¿¡ ³ª¿ÀÁø ¾Ê¾ÒÀ»°Í °°½À´Ï´Ù. Á»´õ ´ÙµëÀ¸½Ã¸é ¿øÇϽô ½ºÅ©¸³Æ®°¡ ³ª¿ÀÁö ¾ÊÀ»±î¿ä?

GPT ÁúÀÇ)
Get-Content "./text.txt" | Group-Object | Where-Object { $_.Count -gt 1 } | Select -ExpandProperty Name
1. Àüü ¶óÀÎÀ» ºÐÇÒÇؼ­ 4~6½º·¹µåÁ¤µµ·Î ó¸® (Àüü ¶óÀÎÀ» Ä«¿îÅÍÇؼ­ ÇÊ¿äÇÑ ½º·¹µå ¼ýÀÚ·Î ³ª´«ÈÄ ½ÃÀÛ ÁöÁ¡À» °¢°¢ ±×¸¸Å­ ´õÇؼ­ ÁöÁ¤)
2. Áøôµµ Ç¥½Ã ¹× ÀϽÃÁßÁö ¹×  °è¼ÓÁøÇàó¸® ±â´É Ãß°¡

GPT ´äº¯ )
: ¸ÕÀú, Àüü ¶óÀÎÀ» ºÐÇÒÇÏ¿© ¿©·¯ ½º·¹µå¿¡¼­ ó¸®ÇÒ ¼ö ÀÖµµ·Ï ÀÛ¾÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. À̸¦ À§Çؼ­´Â ÆÄÀÏÀÇ Àüü ¶óÀÎ ¼ö¸¦ ¼¼°í, ±× ¼ö¿¡ µû¶ó ÀûÀýÇÑ ¼öÀÇ ½º·¹µå·Î ºÐÇÒÇÕ´Ï´Ù. ±×·± ´ÙÀ½, °¢ ½º·¹µå°¡ ó¸®ÇØ¾ß ÇÒ ¶óÀÎ ¹üÀ§¸¦ °è»êÇÕ´Ï´Ù.

#-----------------------------------------
# ÆÄÀÏÀÇ Àüü ¶óÀÎ ¼ö °è»ê
$totalLines = Get-Content "./text.txt" | Measure-Object -Line | Select-Object -ExpandProperty Lines

# »ç¿ëÇÒ ½º·¹µå ¼ö ¼³Á¤ (¿©±â¼­´Â ¿¹½Ã·Î 4~6 »çÀÌÀÇ ½º·¹µå¸¦ »ç¿ë)
$threadCount = Get-Random -Minimum 4 -Maximum 7

# °¢ ½º·¹µå°¡ ó¸®ÇÒ ¶óÀÎ ¹üÀ§ °è»ê
$linesPerThread = [math]::Ceiling($totalLines / $threadCount)

# °¢ ½º·¹µåÀÇ ½ÃÀÛ ÁöÁ¡ °è»ê
$threadRanges = @()
$startLine = 1
for ($i = 1; $i -le $threadCount; $i++) {
    $endLine = [math]::Min($startLine + $linesPerThread - 1, $totalLines)
    $threadRanges += "$startLine-$endLine"
    $startLine = $endLine + 1
}
#-----------------------------------------

ÀÌÁ¦ $threadRanges ¹è¿­¿¡´Â °¢ ½º·¹µå°¡ ó¸®ÇØ¾ß ÇÒ ¶óÀÎÀÇ ¹üÀ§°¡ ÀúÀåµË´Ï´Ù.

: ´ÙÀ½À¸·Î, Áøôµµ Ç¥½Ã ¹× ÀϽÃÁßÁö/°è¼ÓÁøÇàó¸® ±â´ÉÀ» Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù. À̸¦ À§Çؼ­´Â °¢ ½º·¹µå°¡ ¶óÀÎÀ» ó¸®ÇÒ ¶§¸¶´Ù ÁøÇà »óȲÀ» Ç¥½ÃÇÏ°í, ÇÊ¿äÇÑ °æ¿ì »ç¿ëÀÚ ÀÔ·ÂÀ» ¹Þ¾Æ ÀÛ¾÷À» ÀϽà ÁßÁöÇϰųª °è¼Ó ÁøÇàÇÕ´Ï´Ù.

#-----------------------------------------
# °¢ ½º·¹µå¿¡¼­ ÁøÇà »óȲÀ» Ç¥½ÃÇÏ°í »ç¿ëÀÚ ÀÔ·ÂÀ» ó¸®ÇÏ´Â ÇÔ¼ö Á¤ÀÇ
function ProcessLines {
    param (
        [string]$range
    )

    $startLine, $endLine = $range -split '-'

    for ($lineNumber = $startLine; $lineNumber -le $endLine; $lineNumber++) {
        # °¢ ¶óÀÎÀ» ó¸®ÇÏ´Â ÀÛ¾÷ ¼öÇà
        # ¿©±â¿¡ ½ÇÁ¦ ÀÛ¾÷ ³»¿ëÀ» Ãß°¡

        # ÁøÇà »óȲ Ç¥½Ã
        Write-Host "Processing line $lineNumber/$totalLines"

        # »ç¿ëÀÚ ÀÔ·Â È®ÀÎ (ÀϽà ÁßÁö ¶Ç´Â °è¼Ó ÁøÇà)
        $key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown").Character
        if ($key -eq 'p') {
            # 'p' Å°¸¦ ´©¸£¸é ÀϽà ÁßÁö
            Write-Host "ÀÛ¾÷ÀÌ ÀϽà ÁßÁöµÇ¾ú½À´Ï´Ù. °è¼ÓÇÏ·Á¸é 'c'¸¦ ÀÔ·ÂÇϼ¼¿ä."
            do {
                $key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown").Character
            } while ($key -ne 'c')
            Write-Host "ÀÛ¾÷À» °è¼ÓÇÕ´Ï´Ù."
        }
    }
}

# °¢ ½º·¹µå¸¶´Ù ÀÛ¾÷ ½ÃÀÛ
foreach ($range in $threadRanges) {
    Start-ThreadJob -ScriptBlock {
        param (
            [string]$range
        )
        ProcessLines $range
    } -ArgumentList $range
}

# ¸ðµç ½º·¹µå ÀÛ¾÷ÀÌ ¿Ï·áµÉ ¶§±îÁö ´ë±â
Get-Job | Wait-Job

# ¸ðµç ÀÛ¾÷ ¿Ï·á ÈÄ ½º·¹µå Á¾·á
Get-Job | Remove-Job
#-----------------------------------------

À§ÀÇ ¿¹Á¦¿¡¼­´Â °¢ ½º·¹µå°¡ °¢ ¶óÀÎÀ» ó¸®ÇÏ´Â °¡»óÀÇ ÀÛ¾÷À» ¼öÇàÇÏ°í, ±× °úÁ¤¿¡¼­ ÁøÇà »óȲÀ» Ç¥½ÃÇÏ°í »ç¿ëÀÚ ÀÔ·ÂÀ» ¹Þ½À´Ï´Ù. ½ÇÁ¦ ÀÛ¾÷¿¡ ¸Â°Ô ½ºÅ©¸³Æ®¸¦ ¼öÁ¤ÇϽʽÿÀ.
     
dateno1 03-05
½ÃÇèÇغ¸´Ï job »ý¼º ½Ãµµ¸¦ ÇÏ°í, Àüü¸¦ ÀÔ·ÂÇÑ ½º·¹µå ¼ýÀÚ¸¸Å­À¸·Î ³ª´©¾î¼­ »êÃâÇϴ°ͱîÁø Á¤»óÀε¥, Á¤ÀÛ Ã³¸®ÇؾßÇÒ ºÎºÐ¿¡ ³»¿ë Ãß°¡ÇØÁ൵ ÇØ´ç ³»¿ë ½ÇÇàÀº ¾È Çϳ׿ä
¹ÎÈ£¾ç 03-05
Group-Object °¡ ´Ù ÀÐ°í ¹­±â¶§¹®¿¡ ¿À·¡°É¸³´Ï´Ù.
Where-Object { $_.Count -gt 1 } ´Â ¿ÀÈ÷·Á º° ½Ã°£ ¾È°É¸±°Ì´Ï´Ù.
°¢ ´Ü°è¸¦ ÂÉ°³ º¯¼ö¿¡ ³Ö°í ½ÇÇàÀ» ÇÏ¸é ¿À·¡°É¸®´Â º´¸ñÀÌ ¾îµðÀÎÁö º¸ÀÏ°Ì´Ï´Ù.
a = Get-Content "./text.txt"
b = a | Group-Object
...
system32 03-05
python3 ·Î § ¼Ò½ºÀÔ´Ï´Ù.import os
import threading

class LineProcessor:
    def __init__(self, filename):
        self.filename = filename
        self.lock = threading.Lock()
        self.total_lines = 0
        self.processed_lines = 0
        self.duplicates = {}

    def count_lines(self):
        with open(self.filename, 'r') as file:
            for line_number, line in enumerate(file, start=1):
                self.total_lines += 1

    def process_lines(self, start=None, end=None):
        with open(self.filename, 'r') as file:
            if start:
                file.seek(start)
            if end:
                chunk_size = end - start
            else:
                chunk_size = os.path.getsize(self.filename)

            for _ in range(chunk_size):
                line = file.readline()
                if not line:
                    break
                self.processed_lines += 1
                if line in self.duplicates:
                    with self.lock:
                        print(f"Duplicate line '{line.strip()}' found at line number(s): {', '.join(map(str, self.duplicates[line]))}")
                else:
                    self.duplicates.setdefault(line, []).append(self.processed_lines)

    def process_chunk(self, start, end):
        self.process_lines(start, end)
        with self.lock:
            print(f"Processed chunk from {start} to {end}. Progress: {self.processed_lines}/{self.total_lines}")

def find_duplicates(filename, num_threads=4):
    processor = LineProcessor(filename)
    processor.count_lines()
    chunk_size = processor.total_lines // num_threads

    threads = []
    for i in range(num_threads):
        start = i * chunk_size
        end = (i + 1) * chunk_size if i < num_threads - 1 else None
        thread = threading.Thread(target=processor.process_chunk, args=(start, end))
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

    # print("Duplicate lines found:", processor.duplicates)

if __name__ == "__main__":
    filename = "text.txt"
    find_duplicates(filename)

³ª»ÚÁö ¾Ê°Ô °á°ú¸¦ ¹ñ¾îÁֳ׿ä.


QnA
Á¦¸ñPage 226/5687
2014-05   4988326   Á¤ÀºÁØ1
2015-12   1524330   ¹é¸Þ°¡
05-15   1463   °í¾ç½Ã
2021-11   1463   Àü¼³¼ÓÀǹ̡¦
2022-11   1463   epowergate
07-08   1463   GPGPU
2022-03   1463   ½º¿þÀÎ
2023-07   1464   ¸·¿ï¾ú¾î¿ä
2022-04   1464   guest1
2022-01   1464   È­Á¤Å¥»ï
2021-12   1464   ÀÓÇöÁ¦
2022-11   1464   ¹¹µçÆȾƿä
2022-05   1464   ÀÌÁöÆ÷Åä
2023-07   1465   pumkin
02-03   1465   »ç¶ûÇ϶ó
2022-03   1465   ½ÅÀº¿Ö
08-23   1465   ÄܽºÅºÆ¾
01-03   1465   Á¤¹«Çö
05-13   1465   Sakura24
02-16   1465   ¶¥ÀïÀÌ
2022-01   1466   Åë½Å¹öÇÊ
2022-03   1466   Ȧ¸¯0o0