パイプで区切られたデータを垂直形式のデータに変換する方法

パイプで区切られたデータを垂直形式のデータに変換する方法

データを垂直形式でファイルに保存するシナリオがあります。

以下はデータです

143|2345|3456|4567|2345|3457|2019-12-28 12:00:01|2019-12-28

次のロジックを適用した後、私のデータは次の形式です。

cat demo.txt |rev| cut -d'|' -f3-|rev|cut -d'|' -f2-

以下のように必要な出力を提供しました。

2345|3456|4567|2345|3457

ところで、問題は、目的の出力データを垂直形式でテキストファイルに保存したいということです。

以下のファイルと同様に

2345
3456
4567
2345
3457

答え1

tr '|' '\n'

各パイプを改行文字に変換してトリックを実行する必要があります。

echo "143|2345|3456|4567|2345|3457|2019-12-28 12:00:01|2019-12-28" | tr '|' '\n'

あるいは、あなたの場合にあなたが探しているものかもしれません。

cat file | tr '|' '\n' > newfile

答え2

複数の行とさまざまな数のフィールドを処理するには、col1と最後の2つの列を削除し、残りの列を垂直に配置します。

awk '-F|' '{ for (f = 2; f <= NF - 2; ++f) print $(f); }' data.txt

答え3

元のデータとGNUの使用head

$ tr '|' '\n' <demo.txt | head -n -2
143
2345
3456
4567
2345
3457

このtrコマンドは単に|- 文字を改行文字に変更します。標準入力からのみ読み取るため、tr標準入力にリダイレクトする必要があります。

GNUに負の行が与えられると、headデータの末尾からその数を削除します。

または、単一の呼び出しで次の操作を行いますsed

$ sed 's/\(|[^|]*\)\{2\}$//; y/|/\n/' demo.txt
143
2345
3456
4567
2345
3457

ここで、置換は2文字と各文字の後の文字列を|一致させて最後の2つの区切りフィールドを削除し、コマンドは残りの各フィールドを改行に変更します(最初の解決策と同様)。|y|tr

おそらく:を使用すると、より読みやすくなりますsed -E。 (|今 - 文字の1つをエスケープする必要があることに注意してください。)

sed -E 's/(\|[^|]*){2}$//; y/|/\n/' demo.txt

関連情報