2つの文字列を1行にまとめて区切り|
文字として使用したいと思います。を使用してマージできます。区切り文字として文字列をマージawk '{$1,$2,$3$4$5}'
する他の方法はありますか?|
入力する:
XXXXXXXX 0 Xxyxhsag | yuiji
出力:
XXXXXXXX 0 Xxyxhsag|yuiji
答え1
データに区切られたフィールドが含まれており、|
区切り|
文字の両側にスペースを含めることができるとします。次に、使用する入力フィールド区切り文字awk
は式、つまり文字と横のスペースに一致する式です*[|] *
。|
単一文字を|
出力フィールド区切り文字として使用し、awk
出力レコードを強制的に再生成すると(フィールドの1つを設定して)、問題が少なくとも質問で要求された方法で解決されます。
awk -F ' *[|] *' -v OFS='|' '{ $1=$1 }; 1' file
または等しく、
awk -F ' *[|] *' -v OFS='|' '{ $1=$1; print }' file
これをテストしてみてください。
$ cat file
XXXXXXXX 0 Xxyxhsag | yuiji
$ awk -F ' *[|] *' -v OFS='|' '{ $1=$1 }; 1' file
XXXXXXXX 0 Xxyxhsag|yuiji
sed
式に似た置換を使用することもできます。
$ sed 's/ *| */|/g' file
XXXXXXXX 0 Xxyxhsag|yuiji
これは、すべての引用符付きフィールドに区切り文字、改行、または引用符が含まれていないテキストまたは「単純な」CSVデータでデータを処理できると仮定します。
答え2
入力データが与えられると、
XXXXXXXX 0 Xxyxhsag | one
XXXXXXXX 0 Xxyxhsag | two
XXXXXXXX 0 Xxyxhsag|third
基本区切り記号
awk
デフォルトの区切り文字(1つ以上の連続したスペースまたはタブ)を使用します。
awk '{print $1,$2,$3$4$5}' v
XXXXXXXX 0 Xxyxhsag|one
XXXXXXXX 0 Xxyxhsag|two
XXXXXXXX 0 Xxyxhsag|third
3番目のフィールドの変更を確認してください。
awk '{printf "3th:[%s]\n",$3}' v
3th:[Xxyxhsag]
3th:[Xxyxhsag]
3th:[Xxyxhsag|third]
実際の状況に常に5つのフィールドがある場合、これが解決策になる可能性があります。
パイプ(|) 区切り記号
区切り文字として使用できますが、|
これによりフィールドのスペースが保持されます。
awk -F\| '{printf "%s|%s\n", $1, $2}' v
XXXXXXXX 0 Xxyxhsag | one
XXXXXXXX 0 Xxyxhsag | two
XXXXXXXX 0 Xxyxhsag|third
出力区切り記号を次に変更すると、より明確になる可能性があります。!
awk -F\| '{printf "%s!%s\n", $1, $2}' v
XXXXXXXX 0 Xxyxhsag ! one
XXXXXXXX 0 Xxyxhsag ! two
XXXXXXXX 0 Xxyxhsag!third
$1
これで、末尾のスペースを削除してスペースを先行する必要があるため、多くの利点はありません$2
。
答え3
あなたはawk
試すことができます:
awk -F'|' -v OFS='|' '{sub(/ \| /,"|")} 1' file
XXXXXXXX 0 Xxyxhsag|yuiji
- FSとOFSを設定しました(同じ値です
|
) - そうしてこそ、次のような結果が得られます。
awk -F'|' -v OFS='|' '1' file
XXXXXXXX 0 Xxyxhsag | yuiji
|
したがって、以下を使用して周囲のスペースを削除しますsub()
。
{sub(/ \| /,"|")}