リスト内の項目の順序を変更する

リスト内の項目の順序を変更する

プレーンテキストファイルがあります。ファイルには次のリストが含まれています。

@"Joe", @"211",
@"Bob Nelson", @"132",
@"Jack Sierra", @"3422",
@"Walt Robert", @"14",

リストには何千もの名前が含まれています...要素の順序を切り替えて、このリストを次に変換する必要があります。

@"211", @"Joe",
@"132", @"Bob Nelson",
@"3422", @"Jack Sierra",
@"14", @"Walt Robert",

端末でこれを行うにはどうすればよいですか?

答え1

これはスペースを含む文字列に対して機能します。

sed 's/\(@"[^"]*"\), \(@"[^"]*"\)/\2, \1/' input.txt

仕組み:

sed - (s)tream( ed)itor は、入力の各行で (s)ubstosute コマンドを実行し
ます\(@"[^"]*"\), \(@"[^"]*"\)\2, \1

\22番目の一致(2番目の中括弧で)は、最初の一致(最初の中括弧で)を意味します
\1

中かっこはエスケープする必要があるので、\(とがあります\)。内部で@文字を検索し、文字を検索し、"いつでも繰り返される[^"]文字とは異なる文字を見つけて、"文字"を探します。

,その後、コンマの後にスペースがあり、そのような2番目のグループが来ると予想します\2

答え2

最初のフィールド、区切り文字、および2番目のフィールドを一致させ、逆の順序で印刷します。二重引用符の中にカンマを含めることができないとします。

sed -e 's/\(.*,\)\( \)\(.*,\)/\3\2\1/'

awkは行末にカンマがあるので厄介です。それにもかかわらず、スペースを追加したり、フィールド区切り文字でカンマを/ +/置き換えたりできます。

awk -F ', ' '{print $2 " " $1 ","}'

引用符内にカンマがある場合は、引用符エスケープ規則(存在する場合)を考慮する方法でフィールドを一致させる必要があります。

関連情報