파일의 첫 번째 열을 마지막 열로 이동

파일의 첫 번째 열을 마지막 열로 이동

파일의 첫 번째 열을 파일의 마지막 열로 이동하려고 합니다. 이게 내가 가진 거야

awk -F ',' '{first = $1; $1=""; OFS = FS; print $0, first}' file.txt

이 방법은 파일에 한 줄만 있는 경우에 작동합니다. 파일에 여러 줄이 있으면 아무 작업도 수행되지 않습니다. 파일에 캐리지 리턴 및 줄 바꿈 문자(CRLF)가 있습니다.

답변1

다중 문자 RS에 GNU awk 사용:

$ printf 'foo,bar,etc\r\n' |
awk 'BEGIN{RS=ORS="\r\n"; FS=OFS=","} {$(NF+1)=$1; sub("[^"FS"]*"FS,"")} 1'
bar,etc,foo

또는 awk를 사용하십시오.

$ printf 'foo,bar,etc\r\n' |
awk 'BEGIN{ORS="\r\n"; FS=OFS=","} {sub(/\r$/,""); $(NF+1)=$1; sub("[^"FS"]*"FS,"")} 1'
bar,etc,foo

답변2

입력 파일을 다음과 같이 처리할 수 있거나 원한다면 어떻게 될까요?CSV 테이블, 다음과 같은 코드를 실행할 수 있습니다

csvcut -c '2:,1' input

도구(csvkit)는 입력을 동종 테이블로 처리합니다. 입력 예

a,b,c,d,e
1,2,3,4,5
3,4
6,7,8,9,0

산출:

b,c,d,e,a
2,3,4,5,1
4,,,,3              //implicitly added some empty fields
7,8,9,0,6

답변3

필터링하기 전에 가짜 CR 문자를 제거한 후 추가할 수 있습니다.

<file.txt tr -d \\015 | awk -F ',' '{for (field=2; field <=NF; field++) { printf "%s", $field FS } print $1}' | sed 's/$/\o015/' > file-new.txt

예를 들어:

# cat | sed 's/$/\o015/' > test.txt
1,2,3,4,5,6,7
a,b,c,d,e,f,g,h
A,B,C,D
0

Ctrl+D

# <test.txt tr -d \\015 | awk -F ',' '{for (field=2; field <=NF; field++) { printf "%s", $field FS } print $1}' | sed 's/$/\o015/'
2,3,4,5,6,7,1
b,c,d,e,f,g,h,a
B,C,D,A
0

답변4

GNU sed확장 정규식 모드에서 -E:

$ sed -Ee 's/^([^,]*),(.*)(.)$/\2,\1\3/' file | cat -A
2,3,4,1^M$
7,8,9,6^M$
b,c,d,a^M$

그리고 AWK:

$ awk -F ',' '
  BEGIN { OFS = FS }
  NF > 1 {
    first = $1
    cr = substr($NF, length($NF))
    sub(/.$/, "", $NF)
    for (i=1; i<NF; i++)
      $(i) = $(i+1)
    $(NF) = first cr
  }
  1
' file

그리고 perl:

$ perl -F, -pale '
    BEGIN { $" = ","; }         # set OFS to comma
    next unless /,/;            # skip non interesting lines 
    chop $F[-1];                # remove last char, the carriage return
    splice @F, @F, 1, shift @F; # move 1st element to the end
    s/.*/@F\r/;
' file 

관련 정보