プレーンテキストファイルがあります。ファイルには次のリストが含まれています。
@"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
\2
2番目の一致(2番目の中括弧で)は、最初の一致(最初の中括弧で)を意味します
。\1
中かっこはエスケープする必要があるので、\(
とがあります\)
。内部で@
文字を検索し、文字を検索し、"
いつでも繰り返される[^"]
文字とは異なる文字を見つけて、"
文字"
を探します。
,
その後、コンマの後にスペースがあり、そのような2番目のグループが来ると予想します\2
。
答え2
最初のフィールド、区切り文字、および2番目のフィールドを一致させ、逆の順序で印刷します。二重引用符の中にカンマを含めることができないとします。
sed -e 's/\(.*,\)\( \)\(.*,\)/\3\2\1/'
awkは行末にカンマがあるので厄介です。それにもかかわらず、スペースを追加したり、フィールド区切り文字でカンマを/ +/
置き換えたりできます。
awk -F ', ' '{print $2 " " $1 ","}'
引用符内にカンマがある場合は、引用符エスケープ規則(存在する場合)を考慮する方法でフィールドを一致させる必要があります。