質問: コマンドラインから2行ごとに1つにマージする方法は? 次の形式のテキストファイルがあります。最初の行は「key」であり、2行目は「value」です。key 4048:1736 string 3 key 0:1772 string 1 key 4192:1349 string 1 key 7329:2407 string 2 key 0:1774 string 1 キーと同じ行に値が必要です。したがって、出力は次のようになります...key 4048:1736 string 3 key 0:1772 string 1 key 4192:1349 string 1 key 7329:2407 string 2 key 0:1774 string 1 $や,のような区切り文字を使用できればより良いでしょう:key 4048:1736 string , 3 2行を1行にマージするにはどうすればよいですか?
回答: awkの別の方法を次に示します。awk 'ors=nr%2?fs:rs' file $ cat file key 4048:1736 string 3 key 0:1772 string 1 key 4192:1349 string 1 key 7329:2407 string 2 key 0:1774 string 1 $ awk 'ors=nr%2?fs:rs' file key 4048:1736 string 3 key 0:1772 string 1 key 4192:1349 string 1 key 7329:2407 string 2 key 0:1774 string 1 コメントの ed morton で示されているように、安全性のためにブレースを追加し、移植性のために括弧を追加する方が適切です。awk '{ ors = (nr%2 ? fs : rs) } 1' file orsはoutput record separatorの略です。ここで行っているのは、行番号を格納するnrを使用して条件をテストすることです。 nrのモジュロが真の値(> 0)である場合、デフォルトでスペースであるfs(フィールドセパレーター)の値に出力フィールドセパレーターを設定します。それ以外の場合、改行であるrs(レコードセパレーター)の値を割り当てます。,をセパレータとして追加する場合は、次を使用します。awk '{ ors = (nr%2 ? "," : rs) } 1' file