2016-07-16 2 views
1

명령에서 출력을 얻었습니다.이 값은 2048,4096,8192,16384,24576,32768입니다. 로 분할 할 2048,4096,8192,16384,24576,32768 :, 파일 B에 4096, 파일 A를 2048 파일 C에 8192쉘 - SED를 사용하여 한 줄의 텍스트를 조각으로 분할하는 방법은 무엇입니까?

나는 6 개 개의 파일 만 숫자가 아닌 쉼표 예를 들어 초기 텍스트로 분할 할 곧.

출력이 규칙을 따른다고 :

  1. 쉼표로 구분 된 6 개 자리는 항상있다
  2. 숫자는 3에서 5 "길이"에 항상 (내가 적절한 영어 단어를 모르는)
  3. 내가 말했듯이 내가 마지막 X 번호를 삭제하려고 그 숫자

와 수학 연산을 할거야하지만 "감지 할 수있는 방법을하지 않았기 때문에, 쉼표 나에게 관심을하지 않습니다 "쉼표 o 작업을 중지 할 수 있습니다. SED를 사용할 수 있습니까?

+0

이것은 OP가 안드로이드에서 실행될 코드를 요구하고 그것들의 주름으로'#!/system/bin/sh'을 사용하고 있다는 것을 분명히합니다. 따라서 코드는 bash가 아닌 POSIX sh를 위해 작성되어야합니다. –

답변

2

다음은 (당신이 안드로이드에 사용할 가능성이 가장 높은 것 같은 비지 박스 재 등)는 POSIX 호환 쉘 외부 명령없음에 필요 (A, B, C, D, EF)이 모두 현재 작업 디렉토리에 있습니다. 다른 곳에 작성하려면 이름을 수정하거나 cd을 사용하여 다른 디렉토리로 변경하십시오.

+0

이것은 그 것이다. 완전한. 'cd/system'에만 필요합니다. –

+0

더 간단할수록 좋습니다. – SLePort

2

sed가 올바른 도구인지 잘 모르겠습니다. 간단한 배시 스크립트

는 :

  • read 명령 배열 변수 valfile.csv의 값을 대입

    IFS=',' read -ra val < file.csv 
    for i in "${val[@]}"; do 
        echo $i > file$((++j)) 
    done 
    

    그것은 등 file2, file1에 CSV하면 각각의 값을 기록 .

  • 루프를 사용하면 각 값이 파일에 기록됩니다.

현재 디렉토리에 쓰기 권한이 있는지 확인하십시오. 그렇지 않은 경우 리디렉션을 변경하십시오 (예 : > /dirWithWritePermissions/).

+0

지금 Android를 사용하고 있습니다. #!/system/bin/sh mount -o rw, remount/system csv =/system/file.csv IFS = ',' "$ {val [@]}"의 i에 대해 -ra val <$ csv 을 읽습니다. do echo $ i> file $ ((++ j)) 완료되었지만 오류 10을 반환하는 읽기 전용 파일 시스템. 파일에 9 개의 행이 들어 있습니다. 그래서 bash 스크립트를 자세히 설명해주십시오. –

+0

"읽기 전용 파일 시스템"은 쓰기 가능한 위치에 없기 때문에 출력 파일에 쓸 수 없다는 것을 의미합니다. 스크립트의 정확성과 아무 관련이 없습니다. 다른 프로그램도 그렇게 할 수 없습니다. (당신은'/ system'을 읽기/쓰기로 다시 썼지 만 거기에 목적지가 있습니까?) –

+0

@LennoardSilva,'/ bin/sh' (또는'/ system/bin/sh')는 bash로 보장되지 않습니다. 질문에 태그를 달는데 어떤 쉘을 쓰는지 좀 더 구체적으로 밝히시오.이 답변에 사용 된'read -a' (올바르게 태그를 붙인 방식에 따라)는 배쉬즘이며 사용 가능하지 않을 수도 있습니다 POSIX sh에서. –

0
declare list_of_files=(fileA fileB fileC fileD fileE) 
readarray a <<< $(sed 's/,/\n/;{;P;D;}' <<< '2048,4096,8192,16384,24576,32768') 
for i in ${a}; do 
    echo $i > "${list_of_files["$((num++))"]}" 
done 

는 설명 :

  • s/,/\n/ 대체 줄 바꿈
  • {와 모든 쉼표 첫 번째 줄 바꿈
  • D Detetes까지 버퍼 명령 그룹에 패턴에서
  • P 인쇄의 모든 시작 패턴 버퍼의 모든 것을 첫 번째 줄 바꿈까지 처리 한 다음 현재를 다시 시작합니다. 명령 그룹
  • } 명령 그룹에

편집을 종료 : 의 당신이 /system/file에 정보를 복사하려고 할 때 자신의 행의 모든 ​​번호가하고 싶은 말은하자

$ sed 's/,/\n/;{;P;D;}' </sys/module/lowmemorykiller/parameters/minfree> /system/file 

이 생성됩니다 a /system/file 파일 형식화 된 출력이 포함됩니다.

EDIT : 더 짧아도 : sed 's/,/\n/g'. 모든 쉼표를 새 공간으로 바꾸는 것만으로 작동합니다 (끝에있는 g로 완료).

또한 sed은 사용하기 좋은 도구이지만 (혼란스러운 언어와 명령을 사용하는 것이 좋습니다 ...), 더 좋고 빠른 방법은 bash built in read을 사용하는 것입니다.

csv=/system/file.csv 
IFS=, read a b c d e f <"$csv" 
echo "$a" >A 
echo "$b" >B 
echo "$c" >C 
echo "$d" >D 
echo "$e" >E 
echo "$f" >F 

가정을 수행합니다

+0

cat/sys/module/lowmemorykiller/parameters/minfree를 사용하여 2048,4096,8192,16384,24576,32768을 얻었습니다. 이 값을 파일 및 저장 공간에 전달하여 나중에 사용할 수 있습니다 (예 :/system/file, Android에 있음). 그런데 어떻게 스크립트를 사용할 수 있습니까? 나는 적응하려고 노력했지만 아무런 결과도 얻지 못했다. –

+0

제 편집을 참조하십시오. – hgiesel

+0

을 추가했습니다 ...이 작품은 그렇습니다.하지만 왜 세계에서 그렇게할까요? 'IFS =, read A B C D E'는 문자열을 여러 변수로 훨씬 더 효율적으로 읽습니다. OP는 "sed"를 물어볼지도 모르지만, 나는 그것을 사용하는 좋은 이유를 생각할 수 없다. –

0

이 당신을 위해 작동 할 수 있습니다 (GNU는 나오지도, bash는 병렬) : 함께

parallel --xapply echo {1} ">>" part{2} :::: <(sed 's/,/\n/g' file.csv) ::: {1..6} 

이 "지퍼"필요에 따라 짧은 파일을 인용 두 개의 파일.

N.B. 이 명령을 적용하기 전에 part* 개의 파일을 제거해야합니다. 그렇지 않으면 파일이 커집니다 (>> 추가).

+0

OP는 Android에 있습니다. 따라서 그들이 가지고있는 것은 비 GNU 툴 체인 Busybox입니다. 거기에 펄도 없으므로 GNU와 병렬 적으로 존재하지 않습니다. –

관련 문제