Bash 스크립트는 각 줄의 첫 번째 위치를 두 번째 이름의 파일에 에코합니다.

Bash 스크립트는 각 줄의 첫 번째 위치를 두 번째 이름의 파일에 에코합니다.

다음과 같이 구성된 텍스트 파일이 있습니다.

Group 1
asdsdsdsdf.html  jeff
xcvxcvxcvx.html  bob
vrgeiuvhif.html  sue

Group 2
iwdowijdoi.html  mary
pokpompojm.html  doug
ndkjfsjfbs.html  lisa

bash각 그룹의 이름을 딴 디렉터리를 생성하려면 스크립트가 필요합니다 . 그런 다음 첫 번째 줄에 해당 링크와 함께 그룹의 각 사람의 이름을 지정하는 텍스트 파일이 있습니다.

텍스트 파일이라는 이름의 디렉터리와 링크만 포함된 파일을 성공적으로 만들었습니다. 하지만 각 링크를 각 이름 파일에 반영하는 방법이나 그룹별로 정렬하는 방법을 모르겠습니다.

나는 내가 가진 적은 돈으로 그것을 할 수 있는 더 좋은 방법이 있다고 확신합니다.

#!/bin/bash

grep Group list.txt > groups
grep -v Group list.txt > links_names
while read file; do mkdir "${file}"; done < groups
while read line; do export name=`echo $line | awk '{print $2}'`
touch "$name"; done < links_names
while read line; do export link=`echo $line | awk '{print $1}'`
echo "$link" >> links ; done < links_names

rm {groups,links_names,links}

답변1

그리고 awk:

awk '/^Group/{g=$0; system("mkdir \""g"\""); next} g&&$0{print $1 >g"/"$2}' file
  • /^Group/줄이 문자열로 시작하면 Group...
    • g=$0변수를 g그룹 이름(예: )으로 설정합니다 Group 1.
    • system(...)시스템 함수 호출 명령을 사용하여 mkdir디렉터리를 만듭니다(그룹 이름의 공백을 처리하기 위한 추가 따옴표에 유의하세요).
  • g&&$0변수가 정의되어 g있고 행이 비어 있지 않은 경우...
    • print $1 >g"/"$2두 번째 필드(이름)의 값을 통해 첫 번째 필드(링크)의 값을 $1디렉터리 이름의 파일 에 씁니다.g$2

시험을 치르다:

$ cat Group\ 2/doug
pokpompojm.html

답변2

필요하다

각 그룹의 이름을 딴 디렉터리를 만들려면 bash 스크립트가 필요합니다. 그런 다음 첫 번째 줄에 해당 링크와 함께 그룹의 각 사람의 이름을 지정하는 텍스트 파일이 있습니다.

#!/bin/bash
while read a b
do
    # Skip blank lines
    test -z "$a" && continue

    if [[ "$a" == "Group" ]]
    then
        # Create the group directory
        group_dir="$a $b"
        mkdir "$group_dir"
    else
        # Write the link into the named file
        echo "$a" > "$group_dir/$b"
    fi
done <list.txt

순수주의자에게는 몇 가지 제한 사항이 있습니다.

  • 텍스트 파일에 상당한 공백으로 시작하는 줄이 없습니다.
  • 링크에 공백이 포함되어 있지 않습니다.
  • 각 줄에는 공백으로 구분된 정확히 두 단어가 있거나 줄이 비어 있습니다.
  • 비어 있지 않은 첫 번째 줄은 그룹 제목입니다.

이러한 모든 가정은 추가 코드(및 복잡성)를 희생하여 극복할 수 있습니다.

답변3

텍스트 파일이 그룹에서와 같이 엄격한 경우 항상 "그룹"이라고 불리고 뒤에 공백과 단어가 오고 그룹 이름에 공백이 없으며 .html 뒤의 이름에도 마찬가지로 이것이 작동합니다.

#!/bin/bash

parseNdostuff(){
    case $1 in
        Group)
            shift
            mkdir $1
            cd $1
            ;;
        *.html)
            link=$1
            shift
            echo $link > $1
            ;;
        *)
            cd ..
            ;;
    esac

}

while read line
do
   parseNdostuff $line
done <  mytext.txt

while read line끝에 텍스트 파일을 입력 하고 < mytext.txt내가 작성한 함수에 입력하면 됩니다. 함수에서 이 작업을 선택한 이유는 각 행 처리를 단순화하고 대소문자 및 이동을 쉽게 사용할 수 있기 때문입니다.

일부 세부정보:

$1함수의 첫 번째 매개변수입니다( $변수는 매우 특별합니다. 확인해 보세요).

shift푸시다운 매개변수( $1폐기, $2변경 $1, $3-> $2)

디렉터리를 생성하면 cd해당 디렉터리로 이동하므로 명령문이 다시 실행되어 .html 줄이 표시되면 파일이 생성되고 모두 올바른 디렉터리에 연결됩니다.

*)다른 모든 경우에 해당하므로 그룹 사이에 빈 줄이 있으면 cd ..디렉토리로 이동한 다음 스크립트를 시작한 위치로 돌아갑니다. 이 모든 CD는 스크립트 위치와 관련이 있습니다.

관련 정보