5

要求された列番号に値を追加する必要がある、次のコマンドの他の代替/よりインテリジェントな 1 ライナーを探しています。次のsedコマンドは、4番目の列に値4を追加するために適切に機能します。[必要: 1000 レコードを含むファイルがあり、何度も任意の位置に列を追加する必要があります。] 私のアプローチは小規模にのみ適しています。

cat 1.txt

1|2|3|5
1|2|3|5
1|2|3|5
1|2|3|5

sed -i 's/1|2|3|/1|2|3|4|/g' 1.txt

cat 1.txt

1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5

前もって感謝します。

4

4 に答える 4

11

フィールド区切り
http://www.gnu.org/software/gawk/manual/html_node/Field-Separators.html

文字列連結
http://www.gnu.org/software/gawk/manual/html_node/Concatenation.html

デフォルトのパターンとアクション
http://www.gnu.org/software/gawk/manual/html_node/Very-Simple.html

 awk -v FS='|' -v OFS='|' '{$3=$3"|"4} 1' 1.txt
于 2012-07-24T09:32:29.187 に答える
7

を使用する1つの方法awk。スクリプトに2つの引数、列番号と挿入する値を渡します。スクリプトはフィールドの数(NF)をインクリメントし、指定された位置まで最後のフィールドを通過して、そこに新しい値を挿入します。

次のコマンドを実行します。

awk -v column=4 -v value="four" '
    BEGIN {
        FS = OFS = "|";
    }
    {
        for ( i = NF + 1; i > column; i-- ) {
            $i = $(i-1);
        }
        $i = value;
        print $0;
    }
' 1.txt

次の出力で:

1|2|3|four|5
1|2|3|four|5
1|2|3|four|5
1|2|3|four|5
于 2012-07-24T09:18:50.343 に答える
2

coreutils置換を使用して処理する1つの方法:

f=1.txt
paste -d'|'                       \
  <(cut -d'|' -f1-3 $f          ) \
  <(yes  4 | head -n`wc -l < $f`) \
  <(cut -d'|' -f4- $f           )
于 2012-07-24T09:42:52.607 に答える
1

1 つの方法として、coreutils とプロセス置換を使用します。

sed 's/3|/3|4|/' 1.txt
于 2012-08-03T11:59:49.037 に答える