2009-08-11 10 views
4

파일이 탭으로 구분됩니다. 각 줄의 탭 수를 계산하는 powershell 스크립트를 원합니다. 나는 이걸 생각해 냈다.파일의 각 줄에있는 탭 수를 계산하는 Oneliner

${C:\tabfile.txt} |% {$_} | Select-String \t | Measure-Object | fl count 

그러면 파일의 줄 수는 3이다.

내가 잘못하고있는 것에 대한 안내는 없습니까? 파일의 각 줄에 단일 번호를 인쇄하고 싶습니다.

답변

6

코드와 관련된 몇 가지 문제는 그룹화/배열 관리/중첩 루프를 중심으로합니다.

gc test.txt | % { ($_ | select-string `t -all).matches | measure | select count } 
  • 라인으로 텍스트 파일을 읽고 나면, 당신은 스크립트 블록에 파이프 라인의 나머지 부분을 포장해야합니다. 그렇지 않으면 다운 스트림 cmdlet은 어떤 요소가 "현재"줄에서 왔는지 구분할 수 없습니다. PS 파이프 라인은 객체를 하나씩 다루는 것에 관한 것이고 중첩 배열이나 반복자 상태 또는 블라인드 열거에 대한 개념은 없습니다.
  • -AllMatches를 지정해야합니다. 그렇지 않으면 select-string은 각 행의 첫 번째 일치 항목을 찾자 마자 중지됩니다. 그런 다음이 인라인 일치의 "내부 결과 집합"을 얻으려면 공칭 결과 집합에서 Matches 속성을 가져와야합니다.
+0

+1. 그의 원래 코드가 작동하지 않는 이유에 대한 좋은 설명. 아마도 그냥 솔루션을 제공하는 것 이상으로 도움이 될 것입니다 :-) (또한 저는 그것을했을 것입니다. 그러나 Select-String을 결코 사용하지 않았습니다 :-)) – Joey

+0

scriptblock을 사용할 때 여전히 혼란 스럽습니다. 또한 두 솔루션 모두 $ {file.txt}로 파일을 소비하는 대신 gc를 사용한다는 것이 스타일의 문제인지 보았습니다. – JasonHorner

+0

'$ {...} '을 사용할 때 중괄호 사이에 완전한 절대 경로를 넣어야하는 반면'Get-Content'는 상대 경로를 사용할 수 있습니다. 나에 관해서는, 나는'C : \'에 주위에 거짓말을하는 사용자 파일이 없기 때문에'$ {C : \ Users \ me \ ...} '와 같이 항상 귀찮을 것이다. 'Home :'드라이브를 만들었지 만 절대 경로가 싫다. 또한'Get-Content'는 무언가를 찾을 수 없을 때 예외를줍니다. 때때로 이상한 오류를 디버깅 할 때 유용합니다 :-) – Joey

5

첫 번째 시도, 매우 정교한하지 :

gc .\tabfile.txt | % { ($_ -split "`t").Count - 1 } 

내가 탭 문자의 문자열을 분할 할 때, 나는 탭에서이보다 하나 개 더 항목과 배열을 얻을거야, 여기에 사실을 활용 선.

또 다른 방법, 피 분할 선 :

gc .\tabfile.txt | % { ([char[]] $_ -eq "`t").Count } 

문자열이 char[]에 캐스트 할 수 (또한 ToCharArray() 방법이있다), 그때는 비교 연산자가 반환하여, 컬렉션에서 다르게 작동한다는 사실을 사용하고 있습니다 부울 대신 모든 일치하는 항목 그래서 거기의 비교는 항목 수를 얻는 데 필요한 원래 줄의 모든 탭을 포함하는 배열을 반환합니다.

+0

char []에 캐스팅 한 다음 -eq를 사용하여 배열을 자동으로 언 롤 (unrol)합니다. +1 –

+0

Powershell을 사용하여 코드 골프를 시도하면 그 장점이 있습니다 :-) – Joey

+0

이것은 아마도 "더 나은"대답 일지 모르지만 다른 게시물은 내 원래의 질문에 더 잘 대답합니다. – JasonHorner

2

또 다른 옵션 :

$content = Get-Content file.txt | Out-String 
[regex]::matches($content,"\t").count 
4

그리고 또 다른 옵션은 V2를 실행하는 경우.

select-string \t c:\tabfile.txt -All | 
    %{"$($_.matches.count) tabs on $($_.LineNumber)"} 
관련 문제