이와 같은 파일의 열을 어떻게 바꿀 수 있습니까?

이와 같은 파일의 열을 어떻게 바꿀 수 있습니까?

텍스트 파일이 있고 각 줄은 다음과 같이 저장됩니다.

"Video or movie"    "parent"    "Media or entertainment"    "1" "1" "1" "0" "0"

열 3을 열 2로 바꾸고 싶습니다.

"Video or movie"   "Media or entertainment"  "parent"   "1" "1" "1" "0" "0"

쉘 스크립트나 다른 스크립팅 언어를 사용하여 Linux에서 이를 수행하는 방법은 무엇입니까? 가장 간단하고 빠른 방법이 필요합니다.

답변1

이는 필드 구분 기호를 awk사용 하여 수행할 수 있습니다 ". 하지만 이 작업을 수행할 때는 $1비어 있고, $2첫 번째 문자열을 보유하고 있으며, $3문자열 사이의 공백이 있고, $4두 번째 문자열 등이라는 점을 기억해야 합니다 . 또한 모든 필드를 인쇄하고 충분한 값을 입력하기를 바라는 대신 두 문자열을 바꾸는 것이 더 안정적입니다 $n. 이를 염두에 두고 다음이 작동해야 합니다.

awk 'BEGIN{OFS=FS="\""} {tmp=$4;$4=$6;$6=tmp;print}' input_file >output_file

답변2

빠르고 더러운 sed방법은 다음과 같습니다.

sed -e 's/^\("[^"]*"\) *\("[^"]*"\) *\("[^"]*"\)/\1 \3 \2/'

그러나 값 등에 큰따옴표가 있는 필드에서는 실패합니다.

한 가지 예:

echo \"a\" \"b\" \"c d d d\" \"e\" | sed -e 's/^\("[^"]*"\) *\("[^"]*"\)  *\("[^"]*"\)/\1 \3 \2/'

하지만 누군가가 여러분에게 더 간단하고 더 나은 농담을 보여줄 수 있을 것이라고 확신합니다 awk.

답변3

나는 다음을 선택할 것이다:

sed 's/"\(.*\)"/\1/' |
    awk 'BEGIN{FS="\" +\"";OFS="\" \""}{t=$3;$3=$2;$2=t;print}' |
    sed 's/.*/"&"/'

sed스크립트 모두 선행 및 후행 큰따옴표를 처리합니다(구분 기호가 아니고 방해하지 않기 때문입니다). 이 BEGIN절은 필드 분리를 처리합니다. 이는 t=$3;$3=$2;$2=t필드를 교환한 다음 전체 필드를 인쇄하는 표준 관용구입니다(OFS를 필드 구분 기호로 사용).

답변4

다음과 같은 것은 어떻습니까?

awk '{print $1, $3, $2, $4, $5, $6, $7, $8}' file > newfile

관련 정보