텍스트 파일이 있고 각 줄은 다음과 같이 저장됩니다.
"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