아래와 같이 숫자.txt가 포함된 숫자가 포함된 파일이 있습니다.
9374541632553 51243747879841 32030098896914 84654557358238 11000656847765
다음 형식으로 변환하고 싶습니다.
<item>9 3 7 4 5 4 1 6 3 2 5 5 3 <tag>out="9374541632553"
<item>5 1 2 4 3 7 4 7 8 7 9 8 4 1 <tag>out="51243747879841"
<item>3 2 0 3 0 0 9 8 8 9 6 9 1 4 <tag>out="32030098896914"
<item>8 4 6 5 4 5 5 7 3 5 8 2 3 8 <tag>out="84654557358238"
<item>1 1 0 0 0 6 5 6 8 4 7 7 6 5 <tag>out="11000656847765"
변환하려면 다음 명령을 사용하고 있습니다.
cat numbers.txt | while read line; do sed -r "s/([0-9])/\1/g; s/([0-9])/\1 /g ; s/^/<item>/g; s/$/<tag>out="\$line/g" ; done
그러나 내가 얻는 결과는 다음과 같습니다.
<item>5 1 2 4 3 7 4 7 8 7 9 8 4 1 <tag>out="9374541632553
<item>3 2 0 3 0 0 9 8 8 9 6 9 1 4 <tag>out="9374541632553
<item>8 4 6 5 4 5 5 7 3 5 8 2 3 8 <tag>out="9374541632553
<item>1 1 0 0 0 6 5 6 8 4 7 7 6 5 <tag>out="9374541632553
<item>3 3 2 1 6 7 8 2 0 9 3 8 4 2 <tag>out="9374541632553
마지막 열이 행 단위 값이 아닌 첫 번째 행만 인쇄하는 이유를 누구든지 말해 줄 수 있습니까?
출력의 첫 번째 줄은 어떻습니까?
원하는 출력을 얻으려면 필요한 명령을 해석하십시오.
답변1
반복하지 않고도 이 작업을 수행할 수 있습니다 awk
.
awk '{a=$1;gsub(/./,"& ",$1); print "<item>"$1"<tag><out>=""\""a"\""}' numbers.txt
산출:
<item>9 3 7 4 5 4 1 6 3 2 5 5 3 <tag><out>="9374541632553"
<item>5 1 2 4 3 7 4 7 8 7 9 8 4 1 <tag><out>="51243747879841"
<item>3 2 0 3 0 0 9 8 8 9 6 9 1 4 <tag><out>="32030098896914"
<item>8 4 6 5 4 5 5 7 3 5 8 2 3 8 <tag><out>="84654557358238"
<item>1 1 0 0 0 6 5 6 8 4 7 7 6 5 <tag><out>="11000656847765"
설명하다:
- 먼저 첫 번째 필드를
$1
변수에 저장합니다.a
- 각 문자를
$1
자체 문자로 바꾸고 그 뒤에 공백을 넣습니다. - 마지막으로 원하는 순서대로 모든 것을 인쇄합니다.
- 약간 까다로운 부분은
\"
따옴표 자체가 있어야 하는 곳에 큰따옴표를 인쇄 하는 것입니다.
편집(마지막 공백 제거):
awk '{a=$1;gsub(/./,"& ",$1); printf "<item>"$1"\b<tag><out>=""\""a"\"\n"}' numbers.txt
<item>9 3 7 4 5 4 1 6 3 2 5 5 3<tag><out>="9374541632553"
<item>5 1 2 4 3 7 4 7 8 7 9 8 4 1<tag><out>="51243747879841"
<item>3 2 0 3 0 0 9 8 8 9 6 9 1 4<tag><out>="32030098896914"
<item>8 4 6 5 4 5 5 7 3 5 8 2 3 8<tag><out>="84654557358238"
<item>1 1 0 0 0 6 5 6 8 4 7 7 6 5<tag><out>="11000656847765"
답변2
왜냐하면 둘 다 표준 입력 read
에서 데이터를 얻기 때문입니다.sed
while
루프 에서 read
첫 번째 줄을 $line
.그리고 sed
시작합니다. 다른 입력을 제공하지 않으므로 stdin에서 읽습니다. 따라서 cat numbers.txt
나머지 sed
입력이 소비됩니다. 아직 while 루프의 첫 번째 반복에 있으므로 $line 변수는 변경되지 않습니다.
나는 이것을 위해 Perl을 사용할 것입니다:
perl -lne '($spaced = $_) =~ s/./$& /g; print qq{<item>$spaced<tag>out="$_"}' numbers.txt
답변3
sed에서 모든 작업을 수행할 수 있는 한 가지 방법은 다음과 같습니다.
sed '
h;
s/./& /g;
s/.*/<item>&<tag>out=/;
G;
s/\n\([0-9]*\)/"\1"/;
' numbers.txt
답변4
이건 어때...
cat numbers.txt | while read line; do echo $line | sed -r "s/([0-9])/\1/g; s/([0-9])/\1 /g ; s/^/<item>/g; s/$/<tag>out=\"$line\"/g" ; done
또는,
cat numbers.txt | while read line; do echo "<item>$(echo $line | fold -w1 | paste -s -d' ') <tag>out=\"$line\""; done