20

次のような行があります。

one:two:three:four:five:six seven:eight

そして私は一つになるためawkに 使いたい$1$2two:three:four:five:six seven:eight

私は前にそれを得ることができることを知っていsedます。つまり、最初に出現する:withsedを変更してからawk、新しい区切り文字を使用します。

ただし、新しい区切り文字がテキストのどこかにまだ存在しないことを保証できないため、区切り文字を新しいものに置き換えても役に立ちません。

awkこのように振る舞うオプションがあるかどうか知りたい

次のようなものです:

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

印刷されます:

one two:three:four:five:six seven:eight

また、いくつかの操作を行い$1たい$2ので、最初に出現し:た .

4

4 に答える 4

7

このようないくつか?

echo "one:two:three:four:five:six" | awk '{sub(/:/," ")}1' 
one two:three:four:five:six

:これは最初のスペースを置き換えます。後でそれを $1、$2 に入れることができます

echo "one:two:three:four:five:six" | awk '{sub(/:/," ")}1' | awk '{print $1,$2}'
one two:three:four:five:six

または同じ awk で、置換を使用しても、$1 と $2 を好きなように取得できます

echo "one:two:three:four:five:six" | awk '{sub(/:/," ");$1=$1;print $1,$2}'
one two:three:four:five:six

編集:別の区切り記号を使用すると、最初oneにファイルとして取得し、次$1のように休むことができます$2:

echo "one:two:three:four:five:six seven:eight" | awk -F\| '{sub(/:/,"|");$1=$1;print "$1="$1 "\n$2="$2}'
$1=one
$2=two:three:four:five:six seven:eight

ユニークセパレーター

echo "one:two:three:four:five:six seven:eight" | awk -F"#;#." '{sub(/:/,"#;#.");$1=$1;print "$1="$1 "\n$2="$2}'
$1=one
$2=two:three:four:five:six seven:eight
于 2013-10-03T09:06:49.110 に答える
2

あなたが得ることができる最も近いものは、GNU awk のものFPATです:

$ awk '{print $1}' FPAT='(^[^:]+)|(:.*)' file
one

$ awk '{print $2}' FPAT='(^[^:]+)|(:.*)' file
:two:three:four:five:six seven:eight

ただし$2、先頭の区切り文字が含まれますが、それsubstrを修正するために使用できます。

$ awk '{print substr($2,2)}' FPAT='(^[^:]+)|(:.*)' file
two:three:four:five:six seven:eight

すべてをまとめると、次のようになります。

$ awk '{print $1, substr($2,2)}' FPAT='(^[^:]+)|(:.*)' file
one two:three:four:five:six seven:eight

substrback inの結果を保存すると、先頭の区切り文字なしで$2さらに処理できます。$2

$ awk '{$2=substr($2,2); print $1,$2}' FPAT='(^[^:]+)|(:.*)' file
one two:three:four:five:six seven:eight

で動作するはずのソリューションmawk 1.3.3:

awk '{n=index($0,":");s=$0;$1=substr(s,1,n-1);$2=substr(s,n+1);print $1}' FS='\0'
one

awk '{n=index($0,":");s=$0;$1=substr(s,1,n-1);$2=substr(s,n+1);print $2}' FS='\0'
two:three:four five:six:seven

awk '{n=index($0,":");s=$0;$1=substr(s,1,n-1);$2=substr(s,n+1);print $1,$2}' FS='\0'
one two:three:four five:six:seven
于 2013-10-03T09:20:19.347 に答える