컬럼 데이터의 순서를 알파벳 순서로 변경하고 싶어요
입력하다
c,a,b
e,k,d
산출
a,b,c
d,e,k
현재 아래 코드를 사용하고 있습니다
awk -F"," -v OFS="," '{
if($1<=$2 && $2<=$3)
{print $1,$2,$3}
else if($1<=$2 && $3<=$2)
{print $1,$3,$2}
else if($2<=$1 && $1<=$3)
{print $2,$1,$3}
else if($2<=$1 && $3<=$1)
{print $2,$3,$1}
else if($3<=$2 && $2<=$1)
{print $3,$2,$1}
else
{print $3,$1,$2}}' test.txt
4개 이상의 열이 있는 파일을 처리하는 더 간단한 솔루션을 제공할 수 있습니까?
답변1
동의하는 경우 perl
:
$ perl -F, -lane 'print join ",", sort @F' ip.txt
a,b,c
d,e,k
-F,
구분 기호로 분할할 입력 라인을 지정하며 ,
결과는 @F
배열 로 제공됩니다.
sort @F
join
알파벳순으로 정렬되고 결과 배열은 ,
구분 기호를 사용하여 결합됩니다.
그리고GNU awk
$ awk 'BEGIN{PROCINFO["sorted_in"] = "@val_str_asc"}
{s = ""; c=0; split($0,a,",");
for(k in a) s = c++ ? s "," a[k] : a[k];
print s}' ip.txt
a,b,c
d,e,k
바라보다gawk 매뉴얼: 미리 정의된 배열 스캔 순서 사용위에서 사용된 배열 정렬에 대한 세부정보
답변2
GNU awk를 사용하여 정렬:
$ cat tst.awk
BEGIN {
FS=OFS=","
}
{
sub(/\r$/,"")
print sort($0)
}
function sort(inStr, arr,idx,sep,outStr) {
PROCINFO["sorted_in"] = "@val_str_asc"
split(inStr,arr)
for (idx in arr) {
outStr = outStr sep arr[idx]
sep = OFS
}
return outStr
}
$ awk -f tst.awk file
a,b,c
d,e,k
sort
또는 awk를 사용하면 각 입력 줄에 대해 UNIX를 호출 하는 셸이 생성되므로 실행 속도가 훨씬 느려집니다 .
$ cat tst.awk
BEGIN {
FS=OFS=","
}
{
sub(/\r$/,"")
print sort($0)
}
function sort(inStr, cmd,line,sep,outStr) {
gsub(/,/,"\n",inStr)
cmd = "printf \047%s\n\047 \047" inStr "\047 | sort"
while ( (cmd | getline line) > 0 ) {
outStr = outStr sep line
sep = OFS
}
close(cmd)
return outStr
}
$ awk -f tst.awk file
a,b,c
d,e,k
sub(/\r$/,"")
게시한 예제 입력에는 DOS 줄 끝이 있지만 게시한 예상 출력에는 없기 때문입니다 .
답변3
perl -nlE 'say join ",", sort split ","' file.txt
설명하다:
for each line like "r,d,a":
"r,d,a"
↓ split "," it
("r","d","a")
↓ sort it
("a","d","r")
↓ join "," it
"a,d,r"
say it