파일에서 일반 텍스트 줄을 복사하고 중간선 접두사를 사용하여 동일한 파일에 추가하거나 중간선 접두사를 제거합니다.

파일에서 일반 텍스트 줄을 복사하고 중간선 접두사를 사용하여 동일한 파일에 추가하거나 중간선 접두사를 제거합니다.

여러 개의 호스트 파일을 하나의 큰 목록으로 컴파일하는 추악한 스크립트를 만드십시오.

www.대부분의 목록에는 아래와 같이 두 개의 URL 항목이 있습니다. 하나는 있고 다른 하나는 없습니다.

127.0.0.1 facebook.com
127.0.0.1 www.facebook.com

그러나 내 목록 중 일부는 그렇게 두 배로 늘어나지 않지만 그렇게 되기를 바랍니다. 다음과 같이 흩어져 있는 URL이 많이 있습니다.

127.0.0.1 twitter.com
127.0.0.1 www.facebook.com
127.0.0.1 subdomain.facebook.com
127.0.0.1 tumblr.com
127.0.0.1 www.reddit.com

내가 원하는 것은 파일에 나열된 URL을 스캔하여 www.일치하지 않는 모든 행 과 일치하지 않는 www.모든 행을 확인한 다음 누락된 행을 목록에 추가하고 싶습니다. 내 목록은 다음과 같습니다.www.www.

127.0.0.1 twitter.com
127.0.0.1 www.twitter.com
127.0.0.1 facebook.com
127.0.0.1 subdomain.facebook.com
127.0.0.1 www.facebook.com
127.0.0.1 www.subdomain.facebook.com
127.0.0.1 tumblr.com
127.0.0.1 www.tumblr.com
127.0.0.1 reddit.com
127.0.0.1 www.reddit.com

sort -u순서대로일 필요는 없습니다. 마지막 단계로 파일을 실행할 때 누락된 줄을 모두 파일 끝에 추가하면 됩니다 .

답변1

검사를 건너뛰고 쌍을 이루는 라인을 추가한 후 출력을 다음으로 파이프할 수 있습니다 sort -u.

sed '/ www./{                  # if line matches  www.
h                              # copy it over the hold buffer
s// /                          # remove the www. part
G                              # append the original line to the modified one
}
//!{                           # if line doesn't match  www.
h                              # copy it over the hold buffer
s/ / www./                     # add the www. part
G                              # append the original line to the modified one
}
' infile | sort -u

이는 두 열(IP와 URL)이 공백으로 구분되어 있다고 가정합니다. 필요한 경우 정규식을 조정합니다.


또는 을 사용하여 zsh배열의 행을 읽고, www.존재하는 부분을 제거하고, 결과를 고유 요소 배열에 저장한 다음, 각 요소를 있는 그대로 한 번, 추가된 www.부분으로 한 번, 두 번 인쇄할 수 있습니다.

mylist=(${(f)"$(<infile)"})
for i (${(u)mylist[@]/ www./ }) printf '%s\n' ${i} ${i/ / www.}

답변2

다음 스크립트를 사용할 수 있습니다 awk.

script.awk:

{
    gsub("www.", "", $2)
    address[$2]
}
END{
    for (item in address){
        print("127.0.0.1", item)
        print("127.0.0.1", "www." item)
    }
}

불러라

awk -f script.awk input

모든 항목의 시작 부분부터 제거한 www.다음 배열을 채웁니다(값 없이). 값이 이미 존재하는 경우 간단히 덮어쓰므로 중복에 대해 신경 쓸 필요가 없습니다. 마지막으로 배열의 내용을 있는 그대로 한 번, 접두사를 사용하여 한 번 인쇄합니다 www..

관련 정보