"|"로 구분된 두 개의 숫자 시퀀스를 생성합니다.

"|"로 구분된 두 개의 숫자 시퀀스를 생성합니다.

seq저는 bash(CentOS 5)를 사용하고 있으며 이 출력을 생성하고 싶습니다( 또는 둘 다 사용할 수 있다고 가정합니까 echo?).

1|1,
2|2,
3|3,
....
31|31,
32|32,
33|33,

나는 예를 찾기 위해 2시간 넘게 인터넷 검색을 해왔고 seq내가 생각해 낼 수 있는 가장 가까운 것은 다음과 같습니다.

echo {1..31}..{1..31} | tr ' ' '\n'

이것은 내가 원하는 것을 거의 제공하지만 ..를 |로 변경하면 엉망이 됩니다. 또는 "|").

필요한 두 번째 숫자는 내림차순 연도와 동일한 형식으로 생성됩니다.

2015|2015,
2014|2014,
...
1938|1938,
1937|1937,
1936|1936,

두 목록을 모두 수동으로 입력했지만 향후 요구 사항과 학습을 위해 명령줄에서 이 작업을 수행하는 방법에 대한 의견을 보내 주시면 감사 seq하겠습니다 echo.

답변1

다음을 수행해야 합니다.

seq 0 31 | awk '{ print $1"|"$1", " }'

내림차순:

seq 31 -1 0 | awk '{ print $1"|"$1", " }'

이들은 awk를 사용하여 파이프 문자로 구분된 각 줄의 숫자를 복사합니다.

또는 순수한 bash를 사용하십시오(의견에서 DopeGhoti가 제안한 대로).

for n in {0..31}; do printf "%d|%d,\n" $n $n; done
for n in {31..0}; do printf "%d|%d,\n" $n $n; done

답변2

내 반전:

  • 순수한awk

    awk 'BEGIN{for(;n<31;)print ++n"|"n","}'
    
  • printf+xargs

    printf '%s\n' {0..31} | xargs -I {} echo "{}|{},"
    
  • repeat루프에zsh

    n=0; repeat 32 echo "$n|$((n++)),"
    

답변3

seq 100|sed 's/.*/&|&,/'

……아마도 효과가 있을 텐데……

쉘은 하나만 있습니다:

i=-1 x=31
while [ "$i" -lt "$x" ]
do    echo "$((i+=1))|$i,"
done

답변4

가장 간단한 솔루션(ksh93, bash, zsh):

printf '%s|%s,\n' {1..31}{,}             ### Ascending  sequence.
printf '%s|%s,\n' {2015..1936}{,}        ### Descending sequence.

또는 루프를 사용해야 하는 경우:

i=0 x=31
while    (( i++ < x ))
do       echo "$i|$i,"
done

관련 정보