ファイルの最初の列をファイルの最後の列に移動しようとしています。これは私が持っているものです。
awk -F ',' '{first = $1; $1=""; OFS = FS; print $0, first}' file.txt
この方法は、ファイルに1行しかない場合に機能します。ファイルに複数の行がある場合、何もしません。ファイルにキャリッジリターンと改行文字(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