私はこれをやっています
for pathname in /user/home/file_*; do
cat "$pathname" | sed -n '3p'; printf"\n";
done> user/home/foo;
for pathname in /user/home/file_*; do
cat "$pathname" | grep "word";
printf"\n";
done> user/home/bar;
paste foo bar > combined
&をcombined
書かずに直接書く方法は何ですか?ディレクトリが大きいので、実行時間を短くしてください。foo
bar
頑張った
for pathname in /user/home/file_*; do
cat "$pathname" | sed -n '3p'; printf"\n";
done | paste > combined;
for pathname in /user/home/file_*; do
cat "$pathname" | grep "word";
printf"\n";
done | paste > combined;
しかし、最初のリストは上書きされます。
ベストアンサー1
申し訳ありません。質問を誤解した可能性があります。一緒にいるかもしれない https://stackoverflow.com/questions/31546680/how-to-pipe-grep-output-to-paste-input
Pasteコマンドは、ストリームの代わりに2つ以上のファイルを使用して列構造を維持し、結合ファイルの左から右に配置します。左から右に列を結合するには、次のリンクが興味深いことがあります。 https://www.geeksforgeeks.org/paste-command-in-linux-with-examples/ 「2.他のコマンドとの組み合わせ」では、「カット」との組み合わせについて説明します。 file1にタブで区切られた2つの列がある場合、file2には1つの列があり、連続切り取りと貼り付けパイプラインを実行できます。
cut -d\ -f1-2 file1 | paste - file2 | cut -d\ -f1-3 | paste - file3
ここで、-d\ の後の見えない文字はタブ文字です (コマンドラインの ctl-V タブ、実際にはタブは「貼り付け」と同様に「切り取り」のデフォルトの区切り文字である可能性があります)。それぞれ「貼り付け」の後ろのハイフンは、パイプ入力ストリームの列位置。
または、すべての列が保存されるため、次のようになります。
cut -d\ -f1-2 file1 | paste - file2 | paste - file3
2番目のファイルのすべての出力を最初のファイルの出力の下に置くには、サブシェルを使用するという元の提案があります。
( source cmdLIST1.csh ; source cmdLIST2.csh ) > combinedOUTPUT.txt
役に立つかもしれません。
Chaiの答えは「bash」と「zsh」では動作しますが、「tcsh」では動作しないように見え、おそらく最も簡単です。