나는 많은 수의 항목을 포함하는 test.txt 파일을 가지고 있습니다. 아래는 그 예입니다.
Afghanistan
Albania
Algeria
Andorra
Angola
Antigua and Barbuda
Argentina
Armenia
Australia
Austria
Azerbaijan
The Bahamas
Bahrain
Bangladesh
Barbados
Belarus
Belgium
Belize
Benin
Bhutan
Bolivia
Bosnia and Herzegovina
Botswana
Brazil
Brunei
Bulgaria
Burkina Faso
Burundi
Cabo Verde
Cambodia
Cameroon
Canada
Central African Republic
Chad
Chile
China
Colombia
Comoros
cat test.txt | tr '\n' ','
새 줄을 쉼표로 구분된 목록으로 변환하는 데 사용할 수 있습니다 .
그러나 아래 표시된 대로 각각 6개 세트로 별도의 목록을 만드는 명령을 원합니다.
Afghanistan,Albania,Algeria,Andorra,Angola,Antigua and Barbuda
Argentina,Armenia,Australia,Austria,Azerbaijan,The Bahamas
Bahrain,Bangladesh,Barbados,Belarus,Belgium,Belize
and so on ...
Centos bash 쉘에서 이 작업을 어떻게 수행할 수 있나요?
답변1
$ paste -d, - - - - - - <file
Afghanistan,Albania,Algeria,Andorra,Angola,Antigua and Barbuda
Argentina,Armenia,Australia,Austria,Azerbaijan,The Bahamas
Bahrain,Bangladesh,Barbados,Belarus,Belgium,Belize
Benin,Bhutan,Bolivia,Bosnia and Herzegovina,Botswana,Brazil
Brunei,Bulgaria,Burkina Faso,Burundi,Cabo Verde,Cambodia
Cameroon,Canada,Central African Republic,Chad,Chile,China
Colombia,Comoros,,,,
여기서 명령 paste
은 쉼표로 구분된 출력의 6개 열을 생성하는 데 사용됩니다.
예제에는 마지막 행의 마지막 몇 열을 채울 만큼 데이터가 충분하지 않으므로 열이 비어 있습니다. 이를 제거하려면 sed '$s/,*$//'
마지막 줄의 모든 후행 쉼표가 제거되는 결과를 파이프하십시오.
$ paste -d, - - - - - - <file | sed '$s/,*$//'
Afghanistan,Albania,Algeria,Andorra,Angola,Antigua and Barbuda
Argentina,Armenia,Australia,Austria,Azerbaijan,The Bahamas
Bahrain,Bangladesh,Barbados,Belarus,Belgium,Belize
Benin,Bhutan,Bolivia,Bosnia and Herzegovina,Botswana,Brazil
Brunei,Bulgaria,Burkina Faso,Burundi,Cabo Verde,Cambodia
Cameroon,Canada,Central African Republic,Chad,Chile,China
Colombia,Comoros
답변2
mapfile -t data < test.txt;
printf '%s,%s,%s,%s,%s,%s\n' "${data[@]}";
오프셋이 크고 실행 가능한 솔루션이 필요한 경우 awk를 사용하고, 그렇지 않은 경우 순수 쉘을 원하면 약간의 루핑이 필요할 수 있습니다!
f () {
offset=$1;
infile="$2";
mapfile -t data < "$infile";
while ((${#data[@]}));do
line="$(printf '%s,' "${data[@]:0:offset}")";
data=("${data[@]:offset}");
echo "${line%,*}";
done
}
f 5 test.txt
답변3
원하는 수의 열에 대해 다음을 수행합니다.
awk -v col=6 '{printf "%s%s", (NR>1) ? (NR-1) % col ? "," : RS : "", $0}
END{if (NR) print ""}' < your-file
사용하십시오 pr
(예제의 입력에 pr
일부 구현에서 인식되는 특수 시퀀스 중 하나가 포함되어 있지 않다고 가정합니다. GNU 시퀀스(CEntOS에서 발견됨)의 경우 최소한 폼피드 문자를 포함합니다):
pr -t -a -s, -6 < your-file
GNU를 사용하면 (또는 비표준 ) pr
을 사용하지 않는 한 36개 열(72개 열의 절반, 기본 페이지 너비)을 초과할 수 없지만 일부 잘림/패딩이 발생한다는 것을 알 수 있습니다. 이 문제를 해결하기 위해 GNU 확장도 사용할 수 있지만 이것이 어떤 다른 부작용을 가져올지는 누가 알겠습니까?-w
-W
-J
GNU의 45개 열의 경우 pr
:
pr -Jtas, -w90 -45
(YMMV 다른 pr
구현과 마찬가지로 이 pr
명령도 매우 혼란스럽습니다.)
답변4
awk를 사용할 수 있습니다.
$ awk 'BEGIN{i=1;} { a[i]=a[i]","$0;if(NR%6==0){sub(",","",a[i]);print a[i];i++;} } END {if(a[i]){sub(",","",a[i]);print a[i]}}' file
Afghanistan,Albania,Algeria,Andorra,Angola,Antigua and Barbuda
Argentina,Armenia,Australia,Austria,Azerbaijan,The Bahamas
Bahrain,Bangladesh,Barbados,Belarus,Belgium,Belize
Benin,Bhutan,Bolivia,Bosnia and Herzegovina,Botswana,Brazil
Brunei,Bulgaria,Burkina Faso,Burundi,Cabo Verde,Cambodia
Cameroon,Canada,Central African Republic,Chad,Chile,China
Colombia,Comoros
또는 Perl 한 줄짜리를 사용하십시오.
perl -a -F'\n' -00 -ne ' map { (($_ + 1)%6 == 0) ? print $F[$_]."\n" : print $F[$_].","; } ( 0 .. @F-1); print "\n" if eof' file